Class JanaReader

java.lang.Object
org.jmol.adapter.smarter.AtomSetCollectionReader
org.jmol.adapter.readers.xtal.JanaReader
All Implemented Interfaces:
javajs.api.GenericLineReader

public class JanaReader extends AtomSetCollectionReader
A reader for Jana M50+M40 file pairs. TODO: rigid-body rotation TLS, local symmetry, and local axes
Author:
Bob Hanson hansonr@stolaf.edu 8/7/2013
  • Field Details

    • lattvecs

      private javajs.util.Lst<float[]> lattvecs
    • thisSub

      private int thisSub
    • modAxes

      private String modAxes
    • haveM40Data

      private boolean haveM40Data
    • records

      static final String records
      See Also:
    • TITLE

      static final int TITLE
      See Also:
    • CELL

      static final int CELL
      See Also:
    • NDIM

      static final int NDIM
      See Also:
    • QI

      static final int QI
      See Also:
    • LATT

      static final int LATT
      See Also:
    • SYM

      static final int SYM
      See Also:
    • SPG

      static final int SPG
      See Also:
    • END

      static final int END
      See Also:
    • WMATRIX

      static final int WMATRIX
      See Also:
    • qicount

      private int qicount
    • molName

      private String molName
    • molAtoms

      private javajs.util.Lst<Atom> molAtoms
    • molTtypes

      private javajs.util.Lst<Integer> molTtypes
    • modelMolecule

      private javajs.util.Lst<javajs.util.P3> modelMolecule
    • molHasTLS

      private boolean molHasTLS
    • matR

      private javajs.util.M3 matR
    • rho

      private javajs.util.P3 rho
    • firstPosition

      private boolean firstPosition
    • vR

      private javajs.util.V3 vR
    • v0Cart

      private javajs.util.V3 v0Cart
    • isLegendre

      private boolean isLegendre
    • U_LIST

      public static final String U_LIST
      See Also:
    • XYZ

      private static String[] XYZ
    • floats

      private float[] floats
  • Constructor Details

    • JanaReader

      public JanaReader()
  • Method Details

    • initializeReader

      public void initializeReader() throws Exception
      Overrides:
      initializeReader in class AtomSetCollectionReader
      Throws:
      Exception
    • checkLine

      protected boolean checkLine() throws Exception
      Overrides:
      checkLine in class AtomSetCollectionReader
      Returns:
      true if need to read new line
      Throws:
      Exception
    • doPreSymmetry

      public void doPreSymmetry() throws Exception
      Overrides:
      doPreSymmetry in class AtomSetCollectionReader
      Throws:
      Exception
    • finalizeSubclassReader

      public void finalizeSubclassReader() throws Exception
      Description copied from class: AtomSetCollectionReader
      optional reader-specific method run first.
      Overrides:
      finalizeSubclassReader in class AtomSetCollectionReader
      Throws:
      Exception
    • finalizeSubclassSymmetry

      protected void finalizeSubclassSymmetry(boolean haveSymmetry) throws Exception
      Overrides:
      finalizeSubclassSymmetry in class AtomSetCollectionReader
      Parameters:
      haveSymmetry -
      Throws:
      Exception
    • cell

      private void cell() throws Exception
      Throws:
      Exception
    • ndim

      private void ndim() throws Exception
      Throws:
      Exception
    • qi

      private void qi() throws Exception
      Throws:
      Exception
    • symmetry

      private void symmetry() throws Exception
      Throws:
      Exception
    • readM40Data

      private void readM40Data(boolean haveReader) throws Exception
      read the M40 file, possibly as the extension of M50+M40
      Parameters:
      haveReader -
      Throws:
      Exception
    • getInt

      private int getInt(int col1, int col2)
      safe int parsing of line.substring(col1, col2);
      Parameters:
      col1 -
      col2 -
      Returns:
      value or 0
    • getStr

      private String getStr(int col1, int col2)
      safe string parsing of line.substring(col1, col2);
      Parameters:
      col1 -
      col2 -
      Returns:
      value or ""
    • getFlag

      private boolean getFlag(int i)
      safely get a one-character 0 or 1 as a boolean
      Parameters:
      i -
      Returns:
      true if it was a 1
    • skipToNextAtom

      private String skipToNextAtom() throws Exception
      Throws:
      Exception
    • readM40WaveVectors

      private void readM40WaveVectors() throws Exception
      Throws:
      Exception
    • processPosition

      private void processPosition(String posName, Atom pos, boolean isAxial) throws Exception
      We process the Pos#n record here. This involves cloning the free atoms, translating and rotating them to the proper locations, and copying the modulations. Jmol uses the alternative location PDB option (%1, %2,...) to specify the group, enabling the Jmol command DISPLAY configuration=1, for example. We also set a flag to prevent autobonding between alt-loc sets. This is not perfect, as in some cases "pos#2" would be better than "pos#1" in terms of bonding. At this point we only support systType=1 (basic coordinates)
      Parameters:
      posName -
      pos -
      isAxial -
      Throws:
      Exception
    • cartesianProduct

      private void cartesianProduct(javajs.util.T3 vA, javajs.util.T3 vB)
      dual-purpose function for cross products, proper rotations, and improper rotations
      Parameters:
      vA -
      vB -
    • readAtomRecord

      private float[][] readAtomRecord(Atom atom, javajs.util.P3 rm, javajs.util.P3 rp, boolean isPos) throws Exception
      Read the atom or pos# record, including occupancy, various flags, and, especially, modulations. Not implemented: TLS, space groups, and local position rotation axes.
      Parameters:
      atom -
      rm - // rotation vector/point not implemented
      rp - // rotation point not implemented
      isPos -
      Returns:
      pos# record's rotational displacement data
      Throws:
      Exception
    • addSinCos

      private void addSinCos(int j, String key, String label, boolean isPos) throws Exception
      Add x, y, and z modulations as [ csin, ccos, 0 ] or, possibly Legendre [ coef, order, 0 ]
      Parameters:
      j -
      key -
      label -
      isPos -
      Throws:
      Exception
    • ensureFourier

      private void ensureFourier(int j)
      Make sure that F_n record is present.
      Parameters:
      j -
    • readM40Floats

      private String readM40Floats() throws Exception
      Throws:
      Exception
    • parseM40Floats

      private void parseM40Floats()
    • readM40FloatLines

      private float[][] readM40FloatLines(int nLines, int nFloats) throws Exception
      Throws:
      Exception
    • adjustM40Occupancies

      private void adjustM40Occupancies()
      M40 occupancies are divided by the site multiplicity; here we factor that back in.
    • copyModulations

      private void copyModulations(String label, String newLabel)
      Create a new catalog entry for an atom's modulation components. Just occupation and displacement here.
      Parameters:
      label -
      newLabel -
    • setRigidBodyPhase

      private double[] setRigidBodyPhase(String key, double[] v)
      Adjust phases to match the difference between the atom's position and the rigid molecular fragment's reference point. We have: a' = g + vR Here we want just the local rotational part, vR
      Parameters:
      key -
      v -
      Returns:
      phase-adjusted parameters
    • setRigidBodyRotations

      private void setRigidBodyRotations(String label, float[][] params)
      Transform unphased Fourier x,y,z cos/sin coefficients in a rigid body system based on distance from center. We have: a' = g + vR = g + R(v0) Here we need just the original atom offset from the reference point, v0, as a Cartesian vector.
      Parameters:
      label - ";atomName"
      params - block of [nDisp][6] rotational parameters
    • combineModulation

      private double[] combineModulation(String key, float csin, float ccos)
      Retrieve cataloged displacement and add in this component, returning a new double[3].
      Parameters:
      key -
      csin -
      ccos -
      Returns:
      new array
    • setMolecularModulation

      private void setMolecularModulation(String key, float csin, float ccos)
      Add the modulation after applying rigid-body phase correction
      Parameters:
      key -
      csin -
      ccos -