Module desmondsimulation
A module to provide access to a Desmond simulation.
  The DesmondSimulation class interacts with AnalysisTool subclasses to complete analyses of the 
  simulation. AnalysisTool subclasses are passed in to the DesmondSimulation.analyze method and they implement an 
  API that is required by DesmondSimulation. The API that the DesmondSimulation.analyze method requires is 
  demonstrated by the following pseudo-code:
   def analyze(analyses):
       for frame in desmond_frames:
           for analysis in analyses:
               if analysis.shouldProcessFrame(frame):
                   if analysis not initialized:
                       analysis.doFrameInit(frame)
                   analysis.processFrame(frame)
       for analysis in analyses:
           analysis.postProcess()
  The shouldProcessFrame method is implemented in the AnalysisTool 
  superclass.
  Methods that must be implemented in the AnalysisTool subclass are:
  
    - 
      processFrame
    
- 
      getFrameResults
    
Methods that are optional but that will be used by DesmondSimulation 
  if present are:
  
  Copyright Schrodinger, LLC. All rights reserved.
    |  | 
        
          | _create_simulation(cmsfile,
        trjfile) |  |  | 
    |  | 
        
          | get_fep_ct_indices(cmsfile) return fep ct indices in pair
 |  |  | 
    |  |  | 
    |  | 
        
          | create_simulation(cmsfile,
        trjfile) |  |  | 
    |  | _INVALID_FRAME_ID = -1 | 
    |  | _structure_cache = {} | 
    |  | __package__ = 'schrodinger.trajectory' |