def test1(self): 'complex. pack, detector, pixel hierarchy' mca = md.eventModeMCA( outfilename, (npacks, ndetsperpack, npixelsperdet,) ) cylinder = operations.subtract( primitives.cylinder( sample2det * 1.1, detlength ), primitives.cylinder( sample2det * 0.9, detlength ) ) ds = md.detectorSystem( cylinder, tofparams, mca ) pack0 = makepack() packs = [pack0] for i in range(1, npacks): packs.append( mccomposite.scatterercopy( pack0, id = i ) ) continue for i in range( npacks ): z = 0 * meter angle = (i-packindexat0)* 5./180 * N.pi x = sample2det * math.cos(angle) y = sample2det * math.sin(angle) ds.addElement( packs[i], (x,y,z) ) continue cds = mh.scattererEngine( ds, coordinate_system = "InstrumentScientist" ) for i in range(nevents): if i%1000 == 0: print i ev = mcni.neutron( r = (-L1,0,0), v = (vi,0,0) ) cds.scatter(ev) continue return
def onHollowCylinder(self, hollowCylinder): from mccomposite.geometry.primitives import cylinder from mccomposite.geometry.operations import subtract r1 = hollowCylinder.in_radius r2 = hollowCylinder.out_radius if r1 >= r2: msg = 'inner radius (%s) should be smaller than outer radius (%s)' %( r1, r2) raise RuntimeError, msg h = hollowCylinder.height if r1 == 0*r1: shape = cylinder(r2, h) else: shape = subtract( cylinder( r2, h ), cylinder(r1,h*2) ) return shape.identify(self)
def test1(self): 'complex. pack, detector, pixel hierarchy' mca = md.eventModeMCA(outfilename, ( npacks, ndetsperpack, npixelsperdet, )) cylinder = operations.subtract( primitives.cylinder(sample2det * 1.1, detlength), primitives.cylinder(sample2det * 0.9, detlength)) ds = md.detectorSystem(cylinder, tofparams, mca) pack0 = makepack() packs = [pack0] for i in range(1, npacks): packs.append(mccomposite.scatterercopy(pack0, id=i)) continue for i in range(npacks): z = 0 * meter angle = (i - packindexat0) * 5. / 180 * N.pi x = sample2det * math.cos(angle) y = sample2det * math.sin(angle) ds.addElement(packs[i], (x, y, z)) continue cds = mh.scattererEngine(ds, coordinate_system="InstrumentScientist") for i in range(nevents): if i % 1000 == 0: print i ev = mcni.neutron(r=(-L1, 0, 0), v=(vi, 0, 0)) cds.scatter(ev) continue return
def he3tube_withpixels( radius=units.length.inch / 2, height=units.length.meter, npixels=128, direction='z', id=0, pressure=10 * units.pressure.atm, mcweights=(0.9, 0, 0.1), ): import mccomposite.geometry.primitives as primitives cylinder = primitives.cylinder(radius, height) import mccomposite.geometry.operations as operations if direction == 'x': shape = operations.rotate(cylinder, (0, 90, 0)) elif direction == 'y': shape = operations.rotate(cylinder, (-90, 0, 0)) elif direction == 'z': shape = cylinder else: raise ValueError, "direction must be x, y, or z: %s" % direction ret = he3tube( cylinder, id = id, pressure = pressure, mcweights \ = mcweights ) import numpy as N start = -(npixels - 1) / 2. / npixels * height step = height / npixels displacements = N.array([start + step * i for i in range(npixels)]) positions = N.zeros((npixels, 3)) * units.length.meter ind = {'x': 0, 'y': 1, 'z': 2}[direction] positions[:, ind] = displacements for i in range(npixels): pxl = pixel(id=i) ret.addElement(pxl, positions[i]) continue return ret
def test(self): # create a weird shape from mccomposite.geometry import primitives block = primitives.block((1, 1, 1)) sphere = primitives.sphere(1) cylinder = primitives.cylinder(2, 2.001) from mccomposite.geometry import operations dilated = operations.dilate(sphere, 2) translated = operations.translate(block, (0, 0, 0.5)) united = operations.unite(dilated, translated) rotated = operations.rotate(united, (90, 0, 0)) intersect = operations.intersect(rotated, cylinder) difference = operations.subtract(intersect, sphere) print mccomposite.scattererEngine(difference) shape = difference #shape = block #shape = dilated #shape = united #shape = intersect #shape = operations.rotate(block, (90,0,0) ) #shape = rotated #shape = sphere #shape = operations.subtract(sphere, block) #shape = operations.subtract( primitives.cylinder(1, 2.1), sphere ) #create pure python representation of scatterer composite composite = mccomposite.composite(shape) nprinter = NeutronPrinter(shape) composite.addElement(nprinter) #render the c++ representation ccomposite = mccomposite.scattererEngine(composite) ev = mcni.neutron(r=(0, 0, -5), v=(0, 0, 1)) ccomposite.scatter(ev) return
def test(self): # create a weird shape from mccomposite.geometry import primitives block = primitives.block( (1,1,1) ) sphere = primitives.sphere( 1 ) cylinder = primitives.cylinder( 2,2.001 ) from mccomposite.geometry import operations dilated = operations.dilate( sphere, 2 ) translated = operations.translate( block, (0,0,0.5) ) united = operations.unite( dilated, translated ) rotated = operations.rotate( united, (90,0,0) ) intersect = operations.intersect( rotated, cylinder ) difference = operations.subtract( intersect, sphere ) print mccomposite.scattererEngine( difference ) shape = difference #shape = block #shape = dilated #shape = united #shape = intersect #shape = operations.rotate(block, (90,0,0) ) #shape = rotated #shape = sphere #shape = operations.subtract(sphere, block) #shape = operations.subtract( primitives.cylinder(1, 2.1), sphere ) #create pure python representation of scatterer composite composite = mccomposite.composite( shape ) nprinter = NeutronPrinter( shape ) composite.addElement( nprinter ) #render the c++ representation ccomposite = mccomposite.scattererEngine( composite ) ev = mcni.neutron( r = (0,0,-5), v = (0,0,1) ) ccomposite.scatter(ev) return
def test1(self): 'simple. one detector' ndets = 1 cylinder = primitives.cylinder( detradius, detlength ) he3tube = md.he3tube( cylinder, id = 0, pressure = units.pressure.atm * pressure, mcweights = ( absorption_weight, scattering_weight, transmission_weight) ) mca = md.eventModeMCA( 'events.dat', (ndets,npixels,) ) ds = md.detectorSystem( cylinder, tofparams, mca ) m = units.length.meter for i in range(npixels): pixel = md.pixel( id = i ) he3tube.addElement( pixel, N.array( [0,0,(-0.495+i*0.01)] ) * m, (0,0,0) ) continue ds.addElement( he3tube ) cds = mh.scattererEngine( ds, coordinate_system = "InstrumentScientist" ) for i in range(nevents): if i%1000 == 0 and interactive: # print i print '.', sys.stdout.flush() ev = mcni.neutron( r = (-L,0,0), v = (vi,0,0) ) cds.scatter(ev) continue return
def test_locate(self): from mccomposite.geometry import primitives, locate c = primitives.cylinder(1, 1) assert locate((0, 0, 0), c) == "inside" return
def test_locate(self): from mccomposite.geometry import primitives, locate c = primitives.cylinder(1,1) assert locate( (0,0,0), c ) == "inside" return