def test1(self): "GlobalGeometer: simplest instrument" import elements from Geometer import Geometer instrument = elements.instrument( "instrument" ) instrument_geometer = Geometer( instrument ) instrument_geometer.finishRegistration() local_geometers = [ instrument_geometer ] global_geometer = GlobalGeometer( instrument, local_geometers ) return
class Inventory(base.Inventory): import pyre.inventory #properties ncount = pyre.inventory.float('ncount', default=10000) ncount.meta['tip'] = 'number of total neutrons generated by source' outputdir = pyre.inventory.str('output-dir', default='out') outputdir.meta['tip'] = 'output directory' overwrite_datafiles = pyre.inventory.bool('overwrite-datafiles', default=False) overwrite_datafiles.meta['tip'] = 'overwrite data files?' buffer_size = pyre.inventory.int('buffer_size', default=0) buffer_size.meta[ 'tip'] = 'size of neutron buffer. This is for optimizing the preformance of the simulation. When it is too large, it will occupy too much memory. When it is too small, the simulation will be slow. If you are not sure, please just leave it unset so that the default value will be used.' from List import List sequence = List('sequence', default='') sequence.meta[ 'tip'] = 'sequence of neutron components in this instrument' multiple_scattering = pyre.inventory.bool('multiple-scattering', default=False) multiple_scattering.meta['tip'] = 'if true, enable multiple scattering' #facilities #geometer. this is a place holder. should derive from Geometer #to create a new Geometer for the specific instrument. from Geometer import Geometer geometer = pyre.inventory.facility('geometer', default=Geometer()) geometer.meta['tip'] = 'geometer of instrument' # tracer from NoNeutronTracer import NoNeutronTracer from NeutronTracerFacility import NeutronTracerFacility tracer = NeutronTracerFacility('tracer', default=NoNeutronTracer()) # this option overrides "dumpconfiguration" to provide an iinterface # easier to use dumppml = pyre.inventory.str('dump-pml', default='') dumppml.meta[ 'tip'] = "filename of output configuration (pml) file. if empty, ignored. if the given value is 'yes' or 'on', a default filename will be used." # XXX: to be removed # for backward compatibility dump_instrument = pyre.inventory.bool('dump-instrument') # dump registry to pkl file # this is for advanced users. the saved registry can be compared # to another saved registry, for example. dumpregistry = pyre.inventory.bool('dump-registry', default=False) dumpregistry.meta[ 'tip'] = 'if true, dump the pyre registry to a pkl file' pass # end of Inventory
def test2(self): "GlobalGeometer: instrument with one moderator given abs position" import elements from Geometer import Geometer instrument = elements.ElementContainer( "instrument" ) moderator = elements.moderator( "moderator", 100., 100., 10. ) instrument.addElement( moderator ) instrument_geometer = Geometer( instrument ) instrument_geometer.register( moderator, (0,0,-5), (0,0,0) ) instrument_geometer.finishRegistration() local_geometers = [ instrument_geometer ] global_geometer = GlobalGeometer( instrument, local_geometers ) mod_pos = global_geometer.position( moderator ) / meter self.assertAlmostEqual( mod_pos[0], 0 ) self.assertAlmostEqual( mod_pos[1], 0 ) self.assertAlmostEqual( mod_pos[2], -5 ) return
def test3(self): "GlobalGeometer: instrument with one moderator and monitors given relative position" import elements from Geometer import Geometer instrument = elements.ElementContainer( "instrument" ) moderator = elements.moderator( "moderator", 100., 100., 10. ) instrument.addElement( moderator ) monitor1 = elements.monitor( "monitor1", 100., 100., 10. ) instrument.addElement( monitor1 ) monitor2 = elements.monitor( "monitor2", 100., 100., 10. ) instrument.addElement( monitor2 ) instrument_geometer = Geometer( instrument ) instrument_geometer.register( moderator, (0,0,-5), (0,0,0)) instrument_geometer.register( monitor1, (0,0,-3), (0,0,0)) instrument_geometer.register( monitor2, (0,0,2), (0,0,0), relative = monitor1 ) instrument_geometer.finishRegistration() local_geometers = [ instrument_geometer ] global_geometer = GlobalGeometer( instrument, local_geometers ) moderator_pos = global_geometer.position( moderator ) / meter self.assertAlmostEqual( moderator_pos[0], 0 ) self.assertAlmostEqual( moderator_pos[1], 0 ) self.assertAlmostEqual( moderator_pos[2], -5 ) monitor1_pos = global_geometer.position( monitor1 ) / meter self.assertAlmostEqual( monitor1_pos[0], 0 ) self.assertAlmostEqual( monitor1_pos[1], 0 ) self.assertAlmostEqual( monitor1_pos[2], -3 ) monitor2_pos = global_geometer.position( monitor2 ) / meter self.assertAlmostEqual( monitor2_pos[0], 0 ) self.assertAlmostEqual( monitor2_pos[1], 0 ) self.assertAlmostEqual( monitor2_pos[2], -1 ) return
def __init__( self, shape = None, max_multiplescattering_loops_among_scatterers = None, max_multiplescattering_loops_interactM_path1 = None, min_neutron_probability = None, ): from Geometer import Geometer self.geometer = Geometer() self._elements = [] self._shape = shape self.setMultipleScatteringParams( max_multiplescattering_loops_interactM_path1 = \ max_multiplescattering_loops_interactM_path1, max_multiplescattering_loops_among_scatterers = \ max_multiplescattering_loops_among_scatterers, min_neutron_probability = min_neutron_probability, ) return
class CompositeScatterer: def __init__( self, shape = None, max_multiplescattering_loops_among_scatterers = None, max_multiplescattering_loops_interactM_path1 = None, min_neutron_probability = None, ): from Geometer import Geometer self.geometer = Geometer() self._elements = [] self._shape = shape self.setMultipleScatteringParams( max_multiplescattering_loops_interactM_path1 = \ max_multiplescattering_loops_interactM_path1, max_multiplescattering_loops_among_scatterers = \ max_multiplescattering_loops_among_scatterers, min_neutron_probability = min_neutron_probability, ) return def setMultipleScatteringParams( self, max_multiplescattering_loops_among_scatterers = None, max_multiplescattering_loops_interactM_path1 = None, min_neutron_probability = None, ): self.max_multiplescattering_loops_among_scatterers = max_multiplescattering_loops_among_scatterers or 5 self.max_multiplescattering_loops_interactM_path1 = max_multiplescattering_loops_interactM_path1 or 1 self.min_neutron_probability = min_neutron_probability or 0. return def addElement(self, element, position = (0,0,0), orientation = (0,0,0) ): self._elements.append(element) self.geometer.register(element, position, orientation) return def elements(self): return self._elements def identify(self, visitor): return visitor.onCompositeScatterer(self) def shape(self): if self._shape is None: from geometry.operations import unite self._shape = unite( *[self._getElementShape(e) for e in self.elements() ] ) pass return self._shape def _getElementShape(self, e): s = e.shape() g = self.geometer position = g.position(e) orientation = g.orientation(e) import geometry r = geometry.operations.rotate(s, orientation) t = geometry.operations.translate(r, position) return t pass # end of CompositeScatterer
def test4(self): "GlobalGeometer: instrument with layers" import elements from Geometer import Geometer instrument = elements.instrument( "instrument" ) moderator = elements.moderator( "moderator", 100., 100., 10. ) instrument.addElement( moderator ) monitor1 = elements.monitor( "monitor1", 100., 100., 10. ) instrument.addElement( monitor1 ) sample = elements.sample( "sample" ) instrument.addElement( sample) detectorSystem = elements.detectorSystem( "detectorSystem" ) instrument.addElement( detectorSystem ) local_geometers = [] detectorSystem_geometer = Geometer( detectorSystem ) local_geometers.append( detectorSystem_geometer ) #add 8X10 detectors by brute force for i in range(10): detpack = elements.detectorPack( "detpack%s" % i ) detpack_geometer = Geometer( detpack ) for j in range(8): name = "det%s"%j det = elements.detector(name) exec 'det_%s_%s = det' % (i,j) detpack.addElement( det ) detpack_geometer.register( det, (j-3.5, 0, 0 ), (0,0,0) ) continue detpack_geometer.finishRegistration() detectorSystem.addElement( detpack) local_geometers.append( detpack_geometer ) detectorSystem_geometer.register( detpack, (10*i, 0, 0), (0,0,0) ) continue detectorSystem_geometer.finishRegistration() instrument_geometer = Geometer( instrument ) instrument_geometer.register( moderator, (0,0,-5), (0,0,0) ) instrument_geometer.register( sample, (0,0,0), (0,0,0) ) instrument_geometer.register( detectorSystem, (0,0,0), (0,0,0) ) instrument_geometer.register( monitor1, (0,0,-3), (0,0,0) ) instrument_geometer.finishRegistration() local_geometers.append( instrument_geometer ) global_geometer = GlobalGeometer( instrument, local_geometers ) moderator_pos = global_geometer.position( moderator ) / meter self.assertAlmostEqual( moderator_pos[0], 0 ) self.assertAlmostEqual( moderator_pos[1], 0 ) self.assertAlmostEqual( moderator_pos[2], -5 ) detector00_pos = global_geometer.position( 'detectorSystem/detpack0/det0') / meter self.assertAlmostEqual( detector00_pos[0], -3.5 ) self.assertAlmostEqual( detector00_pos[1], 0 ) self.assertAlmostEqual( detector00_pos[2], 0 ) moderator2detector00 = global_geometer.displacement( moderator, 'detectorSystem/detpack0/det0' ) / meter self.assertAlmostEqual( moderator2detector00[0], -3.5 ) self.assertAlmostEqual( moderator2detector00[1], 0 ) self.assertAlmostEqual( moderator2detector00[2], 5 ) return
def geometer(*args, **kwds): 'factory constructs a geometer' from Geometer import Geometer return Geometer(*args, **kwds)
def geometer(*args, **kwds): from Geometer import Geometer return Geometer(*args, **kwds)
def _orientationRecord(self, element): return base.orientation( self, element )
def _positionRecord(self, element): return base.position( self, element )