CoolFace
Datasetpublic

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.

sourceHugging Facecc0-1.0updated 8mo agoView on Hugging Face
4likes101downloads
msb_type.jsonl245 linesDownload Raw Back to data
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![swm4-ndp-log](https://user-images.githubusercontent.com/30535641/187781250-24601b56-99ab-474b-8057-4a9eaab598c8.png)\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) &lt; 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., &quot;Force Field for Monovalent, Divalent, and Trivalent Cations Developed under the Solvent Boundary Potential,&quot; 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., &quot;Force Field for Monovalent, Divalent, and Trivalent Cations Developed under the Solvent Boundary Potential,&quot; 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., &quot;Force Field for Monovalent, Divalent, and Trivalent Cations Developed under the Solvent Boundary Potential,&quot; 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., &quot;Force Field for Monovalent, Divalent, and Trivalent Cations Developed under the Solvent Boundary Potential,&quot; 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., &quot;Force Field for Monovalent, Divalent, and Trivalent Cations Developed under the Solvent Boundary Potential,&quot; 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., &quot;Force Field for Monovalent, Divalent, and Trivalent Cations Developed under the Solvent Boundary Potential,&quot; 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., &quot;Force Field for Monovalent, Divalent, and Trivalent Cations Developed under the Solvent Boundary Potential,&quot; 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; &quot;Comparison of simple potential functions for simulating liquid water&quot;, 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., &quot;Force Field for Monovalent, Divalent, and Trivalent Cations Developed under the Solvent Boundary Potential,&quot; 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) &lt; 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) &lt; 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![Image](https://github.com/user-attachments/assets/7a2d6cea-c838-4560-811f-299c3c73ff9c)\\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![image](https://user-images.githubusercontent.com/5244385/105371916-60968080-5c05-11eb-960f-06faa6715580.png)\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![image](https://user-images.githubusercontent.com/5244385/112561582-d1a90e80-8dd5-11eb-832a-bc85cfa66098.png)\r\n\r\n...and MMFF:\r\n![image](https://user-images.githubusercontent.com/5244385/112561383-64957900-8dd5-11eb-9306-b14bef26d81e.png)\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![image](https://user-images.githubusercontent.com/2325645/112114703-a695a380-8bb8-11eb-9b5c-85ec99315ad5.png)\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 &aring = 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 &arings,\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![image](https://user-images.githubusercontent.com/5244385/123306106-29642c80-d521-11eb-8ec5-fb897a8b308b.png)\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 &aring = 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 &aring : 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&#7,#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![image](https://user-images.githubusercontent.com/540511/188902044-f68acfc1-f92f-4aa2-bd85-d9738b29a1ff.png)\r\nbut not this one:\r\n![image](https://user-images.githubusercontent.com/540511/188902091-2f518741-84ce-42ab-a193-4264ad8e5c5d.png)\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![image](https://user-images.githubusercontent.com/8720575/176784310-ec5c88fa-156a-4dbd-a6df-59ecf9c7ad2b.png)\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![image](https://user-images.githubusercontent.com/8720575/176784328-44bdaa56-d3fd-4ace-a85a-0ce64f679aab.png)\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 &params) {\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 &params) {\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 &params,\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![image](https://user-images.githubusercontent.com/24233741/197587972-6392b0c6-786c-4580-b095-4de746ac04e2.png)\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![image](https://user-images.githubusercontent.com/24233741/197569558-6f31014e-19ec-4371-8c2c-e55ba7987c05.png)\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![image](https://user-images.githubusercontent.com/24233741/200425499-ce02ceb4-ff53-48e7-8ac2-2c85b634b334.png)\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![image](https://user-images.githubusercontent.com/24233741/193469019-6646cdd7-70b0-4a9b-baa4-c93eb8336972.png)\r\n\r\nThe molecule does on the Pyrrolidine N:\r\n\r\n![image](https://user-images.githubusercontent.com/24233741/197821924-98bae79c-7992-43f0-a784-7cb99f5a8e16.png)\r\n\r\nbut the matching core does not contain the chiral center:\r\n\r\n![image](https://user-images.githubusercontent.com/24233741/193469237-346c0fef-a808-431d-a88d-4d83cc909c82.png)\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 &params) 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 &params) 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![image](https://user-images.githubusercontent.com/9198870/216962372-db77f0a2-a703-406b-aa94-1c3d4895a1cf.png)\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 &params) {\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![image](https://user-images.githubusercontent.com/24233741/228696687-4c1273d5-efbb-4bc9-a798-dc7bf2a277ff.png)\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![image](https://user-images.githubusercontent.com/24233741/222020086-efe36b97-8540-467d-b3de-62f0c9f7b750.png)\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 &params) {\n+namespace SmilesWrite {\n+namespace detail {\n+std::string MolToSmiles(const ROMol &mol, const SmilesWriteParams &params,\n+                        bool doingCXSmiles) {\n   if (!mol.getNumAtoms()) {\n     return \"\";\n   }\n@@ -520,6 +523,16 @@ std::string MolToSmiles(const ROMol &mol, const SmilesWriteParams &params) {\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 &params) {\n               true);\n   return result;\n }\n+}  // namespace detail\n+}  // namespace SmilesWrite\n+std::string MolToSmiles(const ROMol &mol, const SmilesWriteParams &params) {\n+  bool doingCXSmiles = false;\n+  return SmilesWrite::detail::MolToSmiles(mol, params, doingCXSmiles);\n+}\n \n std::string MolToCXSmiles(const ROMol &mol, const SmilesWriteParams &params,\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 &params, 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![image](https://github.com/rdkit/rdkit/assets/5244385/7e76698b-6cf5-4a03-825b-78e702f78708)\r\n```\r\nmcs.queryMol\r\n```\r\n![image](https://github.com/rdkit/rdkit/assets/5244385/90905598-2194-49b8-9a5e-90edf9031fe8)\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![image](https://github.com/rdkit/rdkit/assets/5244385/9a1d36f4-2b64-4c8c-8723-540d3cca091e)\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![image](https://github.com/rdkit/rdkit/assets/5244385/85e04b9a-440c-46aa-8afb-ee91f8c0ef1c)\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![image](https://github.com/rdkit/rdkit/assets/5244385/29aff400-53f6-48c2-b74a-9b3b4e8b8cf1)\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![image](https://github.com/rdkit/rdkit/assets/5244385/bfde6008-5e35-407a-a778-65df44f49bea)\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![image](https://github.com/rdkit/rdkit/assets/5244385/b8f8dcfa-7412-4454-8c74-8c35ec6a1fab)\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![image](https://github.com/rdkit/rdkit/assets/5244385/fda6d3a9-9427-49b7-b1c1-51fc8d791212)\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![image](https://github.com/rdkit/rdkit/assets/5244385/48c7b5d1-81e3-4315-9cfc-4a3730157581)\r\n\r\n# Example 2\r\n### ChemDraw\r\n![image](https://github.com/rdkit/rdkit/assets/5244385/5d045eb3-2c6e-4bd7-9d2b-194472aaff31)\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![image](https://github.com/rdkit/rdkit/assets/5244385/38482587-0365-4a9b-81c3-3d169a10cd1f)\r\n\r\n# Example 3\r\n### ChemDraw\r\n![image](https://github.com/rdkit/rdkit/assets/5244385/d0951139-484e-41b6-94e4-b4371d4acaaa)\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![image](https://github.com/rdkit/rdkit/assets/5244385/4092b183-a56c-4ef2-a335-e9c094cb4d6c)\r\n\r\n# Example 4\r\n### ChemDraw\r\n![image](https://github.com/rdkit/rdkit/assets/5244385/6aad781d-b086-404d-bdbc-9fe1ad39f363)\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![image](https://github.com/rdkit/rdkit/assets/5244385/d43c0563-d6cc-4c1d-ad67-10c1e440e997)\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![image](https://github.com/rdkit/rdkit/assets/40327643/bab1a067-2e7d-492e-b4fc-782ab9260f5e)\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![image](https://github.com/user-attachments/assets/d9adf90a-ac66-4c2b-ab4e-920171581d33)\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