/* $Id: sgnorm.c 851 2002-02-09 05:39:17Z wdelano $ */ /* The source code contained in this file is */ /* Copyright (C) 1994-2000 by Ralf W. Grosse-Kunstleve. */ /* Please see the LICENSE file for more information. */ #ifdef _PYMOL_WIN32 #include"os_predef.h" #endif #include <stdio.h> #include <stdlib.h> #include <string.h> #undef SG_GLOBAL #include "sglite.h" #include "sgconst.h" #include "sgrefset.h" int GetRefSetNormAddlG(int SgNumber, int affine, int UseK2L, int UseL2N, T_RTMx *AddlG) { int nAddlG, iType, nAddedMx, i; const char *HMxSym; T_SgOps SgOps[1]; if (SgNumber < 1 || SgNumber > 230) return IE(-1); nAddlG = 0; range1(iType, 2) { HMxSym = NULL; if (iType == 0 && UseK2L) HMxSym = RefSetNormAddlG[SgNumber].K2L; else if (iType == 1 && UseL2N && (SgNumber >= 75 || affine)) HMxSym = RefSetNormAddlG[SgNumber].L2N; if (HMxSym) { ResetSgOps(SgOps); SgOps->NoExpand = 1; nAddedMx = ParseHallSymbol(HMxSym, SgOps, PHSymOptNoCType); if ( nAddedMx < 1 || SgOps->nLTr != 1 || SgOps->fInv - 1 + SgOps->nSMx - 1 + nAddlG > 3) return IE(-1); if (SgOps->fInv == 2) { InitRotMx(AddlG[nAddlG].s.R, -1); rangei(3) AddlG[nAddlG].s.T[i] = SgOps->InvT[i]; nAddlG++; } if (SgOps->nSMx > 1) MemCpy(&AddlG[nAddlG], &SgOps->SMx[1], SgOps->nSMx - 1); nAddlG += SgOps->nSMx - 1; } } return nAddlG; } int CheckMonoRefSetAffNormRestrictions(int SgNumber, const int M[9], int BF) { /* International Tables Volume A, chapter 15, tables 15.3.3 & 15.3.4. */ switch (SgNumber) { case 3: case 4: case 6: case 10: case 11: /* M2 */ break; case 5: case 8: case 12: /* M4 */ case 9: case 15: /* M6 or M12 */ if (M[0] % (2 * BF) == 0) return -1; if (M[6] % (2 * BF) != 0) return -1; if (M[8] % (2 * BF) == 0) return -1; break; case 7: case 13: case 14: /* M5 */ if (M[0] % (2 * BF) == 0) return -1; if (M[2] % (2 * BF) != 0) return -1; if (M[8] % (2 * BF) == 0) return -1; break; } return 0; }