# -- MONITOR -- vulcan_geom.addComment("MONITORS") vulcan_geom.addMonitors(distance=[4.83, 1.50], names=["monitor2", "monitor3"]) # -- ADD BANKS -- # NOTE: # To compensate for the curved (1,2,3,4,6) and flat (5) banks, the actual # physical positions is stored at the eight-pack level. # The bank here is set to (0,0,0) with zero rotations. logging.info(f"Add Banks") bank_ids = df["bank"].unique() lb_pos = ["X", "Y", "Z"] for bank_id in bank_ids: elem_bank = vulcan_geom.addComponent(type_name=f"bank{bank_id}", idlist=f"bank{bank_id}") vulcan_geom.addLocation(elem_bank, x=0, y=0, z=0, rot_y=0) # -- ADD 8PACKS -- # NOTE: # Assume that the given csv files contains measurements for all eight-packs in each bank logging.info(f"Add 8-packs") for bank_id in bank_ids: # select bank bk = df[df["bank"] == bank_id] # make top element elem_bank = vulcan_geom.makeTypeElement(f"bank{bank_id}") # add individual eight packs based on measurements eightpack_ids = bk["eightpack"].unique() type_name = "eightpackshort" if bank_id == 5 else "eightpack" for eightpack_id in eightpack_ids:
row_id = "" row_id_list = [] doc_handle = None for i in range(num_dets): location = detinfo["Location"][i] # REMOVE ME: when A and E rows are filled if location.startswith("A") or \ location.startswith("E"): continue if row_id != location[0]: row_id = location[0] row_id_list.append(row_id) row_id_str = row_id + " row" det.addComponent(row_id_str, row_id_str) doc_handle = det.makeTypeElement(row_id_str) det.addComponent(location, root=doc_handle) xpos = convert(detinfo["X"][i]) ypos = convert(detinfo["Y"][i]) zpos = convert(detinfo["Z"][i]) roty = float(detinfo["Angle"][i]) + FLIPY det_type = "eightpack" if location.startswith("C"): if location.endswith("T"): det_type = "eightpack-top" elif location.endswith("B"): det_type = "eightpack-bottom"
def mirror(x, y, z): r, t, p = topolar(x, y, z) r += 2*analyser t = pi - t p += pi return tocartesian(r, t, p) geometry = MantidGeom(instrument_name, comment=comment, valid_from=valid_from) geometry.addSnsDefaults(indirect=args.geometrytype != 'N') geometry.addSamplePosition() geometry.addModerator(distance=ch12, name="chopper") geometry.addMonitors(names=["monitor"], distance=[mon], neutronic=args.geometrytype != 'N') geometry.addDummyMonitor(0.001, 0.001) geometry.addMonitorIds([0]) geometry.addComponent("single_detectors", "single_detectors") sds = geometry.makeTypeElement("single_detectors") sdc = geometry.addComponent("single_pixel", root=sds, blank_location=False) r = 2*analyser+psd for i in range(len(SD_azimuths)): t=SD_azimuths[i]* pi/180. x = - psd * sin(t) y = 0. z = - psd * cos(t) nx, ny, nz = mirror(x, y, z) if args.geometrytype == 'N': geometry.addLocation(root=sdc, x=nx, y=ny, z=nz, name="single_tube_{0}".format(i+1)) else: geometry.addLocation(root=sdc, x=x, y=y, z=z, nx=nx, ny=ny, nz=nz, name="single_tube_{0}".format(i+1), neutronic=True) geometry.addComponent("psds", "psds") psds = geometry.makeTypeElement("psds")
def main(): from helper import MantidGeom inst_name = "VISION" xml_outfile = inst_name + "_Definition.xml" det = MantidGeom(inst_name, comment=" Created by Stuart Campbell ") det.addSnsDefaults(indirect=True) det.addComment("SOURCE AND SAMPLE POSITION") det.addModerator(-16.0) det.addSamplePosition() # Backscattering Banks are 21-100 BACKSCATTERING_NTUBES = 80 det.addComponent("elastic-backscattering", "elastic-backscattering") handle = det.makeTypeElement("elastic-backscattering") idlist = [] for k in range(BACKSCATTERING_NTUBES): id_start = 26624 + (256 * k) id_end = 26624 + (256 * k) + 255 angle = -(2.25 + 4.5 * k) bankid = 21 + k bank_name = "bank%d" % bankid det.addComponent(bank_name, root=handle) z_coord = -0.998 if k % 2 == 0: # Even tube number (long) centre_offset = BS_ELASTIC_LONG_TUBE_INNER_RADIUS + ( BS_ELASTIC_LONG_TUBE_LENGTH / 2.0) #centre_offset = BS_ELASTIC_LONG_TUBE_INNER_RADIUS component_name = "tube-long-bs-elastic" else: # Odd tube number (short) centre_offset = BS_ELASTIC_SHORT_TUBE_INNER_RADIUS + ( BS_ELASTIC_SHORT_TUBE_LENGTH / 2.0) component_name = "tube-short-bs-elastic" x_coord = centre_offset * math.cos(math.radians(90 - angle)) y_coord = centre_offset * math.sin(math.radians(90 - angle)) det.addDetector(x_coord, y_coord, z_coord, 0, 0, -angle, bank_name, component_name) idlist.append(id_start) idlist.append(id_end) idlist.append(None) det.addDetectorIds("elastic-backscattering", idlist) # 90 elastic banks elastic_banklist = [3, 6, 9, 12, 15, 18] elastic_bank_start = [2048, 6144, 10240, 14336, 18432, 22528] elastic_angle = [22.5, -22.5, -67.5, -112.5, -157.5, 157.5] sample_elastic_distance = 0.635 det.addComponent("elastic", "elastic") handle = det.makeTypeElement("elastic") idlist = [] elastic_index = 0 for i in elastic_banklist: bank_name = "bank%d" % i det.addComponent(bank_name, root=handle) z_coord = 0.0 x_coord = sample_elastic_distance * math.cos( math.radians(elastic_angle[elastic_index])) y_coord = sample_elastic_distance * math.sin( math.radians(elastic_angle[elastic_index])) det.addDetector(x_coord, y_coord, z_coord, -90.0, 0, 0., bank_name, "eightpack-elastic", facingSample=True) idlist.append(elastic_bank_start[elastic_index]) idlist.append(elastic_bank_start[elastic_index] + 2047) idlist.append(None) elastic_index += 1 det.addDetectorIds("elastic", idlist) # Inelastic inelastic_banklist = [1, 2, 4, 5, 7, 8, 10, 11, 13, 14, 16, 17, 19, 20] inelastic_bank_start = [ 0, 1024, 4096, 5120, 8192, 9216, 12288, 13312, 16384, 17408, 20480, 21504, 24576, 25600 ] inelastic_angle = [ 45.0, 45.0, 0.0, 0.0, -45.0, -45.0, -90.0, -90.0, -135.0, -135.0, 180.0, 180.0, 135.0, 135.0 ] inelastic_angle_for_rotation = [ -45.0, -45.0, 180.0, 180.0, -135.0, -135.0, -90.0, -90.0, -225.0, -225.0, 0.0, 0.0, 45.0, 45.0 ] sample_inelastic_distance = 0.5174 det.addComponent("inelastic", "inelastic") handle = det.makeTypeElement("inelastic") idlist = [] inelastic_index = 0 for i in inelastic_banklist: bank_name = "bank%d" % i bank_comp = det.addComponent(bank_name, root=handle, blank_location=True) # location_element = le.SubElement(bank_comp, "location") # le.SubElement(location_element, "rot", **{"val":"90", "axis-x":"0", # "axis-y":"0", "axis-z":"1"}) # Neutronic Positions z_coord_neutronic = sample_inelastic_distance * math.tan( math.radians(45.0)) if inelastic_index % 2 == 0: # Facing Downstream z_coord = 0.01 else: # Facing to Moderator z_coord = -0.01 z_coord_neutronic = -z_coord_neutronic # Physical Positions x_coord = sample_inelastic_distance * math.cos( math.radians(inelastic_angle[inelastic_index])) y_coord = sample_inelastic_distance * math.sin( math.radians(inelastic_angle[inelastic_index])) det.addDetector(-x_coord, y_coord, z_coord, 0, 0, inelastic_angle_for_rotation[inelastic_index] - 90.0, bank_name, "eightpack-inelastic", neutronic=True, nx=-x_coord, ny=y_coord, nz=z_coord_neutronic) efixed = ("Efixed", "3.64", "meV") det.addDetectorParameters(bank_name, efixed) idlist.append(inelastic_bank_start[inelastic_index]) idlist.append(inelastic_bank_start[inelastic_index] + 1023) idlist.append(None) inelastic_index += 1 det.addDetectorIds("inelastic", idlist) # 8 packs det.addComment("INELASTIC 8-PACK") det.addNPack("eightpack-inelastic", INELASTIC_TUBES_PER_BANK, INELASTIC_TUBE_WIDTH, INELASTIC_AIR_GAP, "tube-inelastic", neutronic=True) det.addComment("ELASTIC 8-PACK") det.addNPack("eightpack-elastic", ELASTIC_TUBES_PER_BANK, ELASTIC_TUBE_WIDTH, ELASTIC_AIR_GAP, "tube-elastic", neutronic=True, neutronicIsPhysical=True) # TUBES det.addComment("INELASTIC TUBE") det.addPixelatedTube("tube-inelastic", INELASTIC_TUBE_NPIXELS, INELASTIC_TUBE_LENGTH, "pixel-inelastic-tube", neutronic=True) det.addComment("BACKSCATTERING LONG TUBE") det.addPixelatedTube("tube-long-bs-elastic", BS_ELASTIC_LONG_TUBE_NPIXELS, BS_ELASTIC_LONG_TUBE_LENGTH, "pixel-bs-elastic-long-tube", neutronic=True, neutronicIsPhysical=True) det.addComment("BACKSCATTERING SHORT TUBE") det.addPixelatedTube("tube-short-bs-elastic", BS_ELASTIC_SHORT_TUBE_NPIXELS, BS_ELASTIC_SHORT_TUBE_LENGTH, "pixel-bs-elastic-short-tube", neutronic=True, neutronicIsPhysical=True) det.addComment("ELASTIC TUBE (90 degrees)") det.addPixelatedTube("tube-elastic", ELASTIC_TUBE_NPIXELS, ELASTIC_TUBE_LENGTH, "pixel-elastic-tube", neutronic=True, neutronicIsPhysical=True) # PIXELS det.addComment("PIXEL FOR INELASTIC TUBES") det.addCylinderPixel("pixel-inelastic-tube", (0.0, 0.0, 0.0), (0.0, 1.0, 0.0), (INELASTIC_TUBE_WIDTH / 2.0), (INELASTIC_TUBE_LENGTH / INELASTIC_TUBE_NPIXELS)) det.addComment("PIXEL FOR BACKSCATTERING ELASTIC TUBES (LONG)") det.addCylinderPixel( "pixel-bs-elastic-long-tube", (0.0, 0.0, 0.0), (0.0, 1.0, 0.0), (BS_ELASTIC_LONG_TUBE_WIDTH / 2.0), (BS_ELASTIC_LONG_TUBE_LENGTH / BS_ELASTIC_LONG_TUBE_NPIXELS)) det.addComment("PIXEL FOR BACKSCATTERING ELASTIC TUBES (SHORT)") det.addCylinderPixel( "pixel-bs-elastic-short-tube", (0.0, 0.0, 0.0), (0.0, 1.0, 0.0), (BS_ELASTIC_SHORT_TUBE_WIDTH / 2.0), (BS_ELASTIC_SHORT_TUBE_LENGTH / BS_ELASTIC_SHORT_TUBE_NPIXELS)) det.addComment("PIXEL FOR ELASTIC TUBES (90 degrees)") det.addCylinderPixel("pixel-elastic-tube", (0.0, 0.0, 0.0), (0.0, 1.0, 0.0), (ELASTIC_TUBE_WIDTH / 2.0), (ELASTIC_TUBE_LENGTH / ELASTIC_TUBE_NPIXELS)) det.addComment(" ##### MONITORS ##### ") det.addMonitors(names=["monitor1"], distance=["-6.71625"], neutronic=True) # MONITORS det.addComment("MONITOR SHAPE") det.addComment("FIXME: Do something real here.") det.addDummyMonitor(0.01, 0.03) det.addComment("MONITOR IDs") det.addMonitorIds(["-1"]) det.showGeom() det.writeGeom(xml_outfile)
inst_name = "CNCS" detinfo = readFile(geom_input_file) num_dets = len(detinfo.values()[0]) xml_outfile = inst_name+"_Definition.xml" det = MantidGeom(inst_name, comment=comment, valid_from=valid_from) det.addSnsDefaults() det.addComment("SOURCE AND SAMPLE POSITION") det.addModerator(-36.262) det.addSamplePosition() det.addComment("MONITORS") det.addMonitors(names=["monitor1", "monitor2", "monitor3"], distance=["-29.949", "-28.706", "-1.416"]) label = "detectors" det.addComponent(label, label) doc_handle = det.makeTypeElement(label) for i in range(num_dets): detname = BANKFMT % (i+1) roty = float(detinfo["BankAngle"][i]) + FLIPY xpos = convert(detinfo["Bank_xpos"][i]) ypos = convert(detinfo["Bank_ypos"][i]) zpos = convert(detinfo["Bank_zpos"][i]) det.addComponent(detname, root=doc_handle) det.addDetector(xpos, ypos, zpos, ROTX, roty, ROTZ, detname, "eightpack") det.addComment("STANDARD 8-PACK") det.addNPack("eightpack", NUM_TUBES_PER_BANK, TUBE_WIDTH, AIR_GAP_WIDTH) det.addComment("STANDARD 2m 128 PIXEL TUBE") det.addPixelatedTube("tube", NUM_PIXELS_PER_TUBE, TUBE_SIZE)
positions[key] = positionsSurvey[key] num_banks = [14, 23, 14, 12, 18, 18] #################### # add the id lists for groups - [start, stop, step] start, stop = -1, -1 for i, num_banks_in_pack in enumerate(num_banks): start = stop + 1 stop = start + num_banks_in_pack * 8 * 128 - 1 info = instr.addDetectorIds('Group%d' % (i + 1), [start, stop, None]) for i, _ in enumerate(num_banks): group = 'Group%d' % (i + 1) # set blank_location=False to add <location/> tag to component group = instr.addComponent(group, idlist=group, blank_location=False) #################### # group 1 is banks 1-14 (inclusive) bank_offset = 0 group = instr.makeTypeElement('Group1') for i in range(num_banks[0]): bank_num = bank_offset + i + 1 bank = "bank%d" % bank_num corners = getCorners(bank_num) rect = getRectangle(bank_num, positions, corners) det = instr.makeDetectorElement('pack', root=group) rect.makeLocation(instr, det, bank) # group 2 is banks 15-37 (inclusive) bank_offset += num_banks[0]
if __name__=="__main__": filename='SNS/HYSPEC/hyspec_MotorList4GG.xls' info=read_xls(filename) inst_name="HYSPEC" xml_outfile=inst_name+"_Definition.xml" det=MantidGeom(inst_name) det.addSnsDefaults() det.addComment("SOURCE AND SAMPLE POSITION") det.addModerator("msd -0.001*msd-38.980")# TODO: change moderator position to read from the excel sheet det.addSamplePosition() det.addComment("MONITORS") det.addMonitors(names=["monitor1", "monitor2", "monitor3"],distance=["msd -0.001*msd-3.340", "msd -0.001*msd-1.59643", "-0.200"]) # TODO: change monitor positions to read from the excel sheet label = "Tank" tank=det.addComponent(label, label,blank_location=False) det.addLocationRTP(tank,"0","s2 0.0+s2","0","0","s2 0.0+s2","0") doc_handle = det.makeTypeElement(label) num_dets=len(info["name"]) for i in range(num_dets): det.addComponent(info["name"][i], root=doc_handle) det.addDetector(info["X"][i], info["Y"][i], info["Z"][i], info["RotX"][i], info["RotY"][i], info["RotZ"][i], info["name"][i], "eightpack") det.addComment("STANDARD 8-PACK") det.addNPack("eightpack", info["NUM_TUBES_PER_BANK"], info["TUBE_WIDTH"], info["AIR_GAP_WIDTH"]) det.addComment("STANDARD 1.2m 128 PIXEL TUBE") det.addPixelatedTube("tube", info["NUM_PIXELS_PER_TUBE"], info["TUBE_SIZE"])
banks = readPositionsRight("SNS/POWGEN/PG3_geom_2017.csv") banksL = readPositionsLeft("SNS/POWGEN/PG3_geom_left_2018.csv") for bank in banksL.keys(): banks[bank] = banksL[bank] del banksL # delete the banks that are no longer installed for bank in [1,5,6,10,32,35,38,28,31,34,37,40]: del banks[bank] # create north and south sides sides = {'North':['Column%d' % i for i in range(13,25)], 'South':['Column%d' % i for i in range(1,13)]} # add the empty components for name in sides.keys(): group = instr.addComponent(name) # add the columns to the groups for side in sides.keys(): group = instr.makeTypeElement(side) for column in sides[side]: instr.addComponent(column, root=group) # create an ordered list of all columns columns = set() for name in banks.keys(): column, _ = banks[name] columns.add(column) columns = list(columns) columns.sort()
det.addDetectorStringParameters("correlation-chopper",("sequence",choppersequence)) row_id = "" row_id_list = [] doc_handle = None for i in range(num_dets): location = detinfo["Location"][i] if location[0] == "#": continue if row_id != location[0]: row_id = location[0] row_id_list.append(row_id) row_id_str = row_id + " row" det.addComponent(row_id_str, row_id_str) doc_handle = det.makeTypeElement(row_id_str) det.addComponent("bank"+str(i+1), root=doc_handle) xpos = convert(detinfo["Xsci"][i]) ypos = convert(detinfo["Ysci"][i]) zpos = convert(detinfo["Zsci"][i]) det_type = "sixteenpack" det.addDetector(xpos, ypos, zpos, detinfo["Xrot_sci"][i], detinfo["Yrot_sci"][i], detinfo["Zrot_sci"][i], "bank"+str(i+1), det_type) det.addComment("16-PACK") det.addNPack("sixteenpack", NUM_TUBES_PER_BANK, TUBE_WIDTH, AIR_GAP_WIDTH)
for i in range(banks): pixel_id = file["/entry/instrument/bank%d/pixel_id" % (i + 1)].value distance = file["/entry/instrument/bank%d/distance" % (i + 1)].value polar_angle = file["/entry/instrument/bank%d/polar_angle" % (i + 1)].value polar_angle *= (180.0 / math.pi) azimuthal_angle = file["/entry/instrument/bank%d/azimuthal_angle" % (i + 1)].value azimuthal_angle *= (180.0 / math.pi) analyser_wavelength = file["/entry/instrument/analyzer%d/wavelength" % (i + 1)].value analyser_energy = 81.8042051 / analyser_wavelength**2 bank_id = "bank%d" % (i + 1) det.addComponent(bank_id, bank_id) #doc_handle = det.makeTypeElement(bank_id) det.addDetectorPixels(bank_id, r=distance, theta=polar_angle, phi=azimuthal_angle, names=pixel_id, energy=analyser_energy) det.addDetectorPixelsIdList(bank_id, r=distance, names=pixel_id) # Pixel Height y_pixel_offset = file["/entry/instrument/bank1/y_pixel_offset"].value pixel_ysize = y_pixel_offset[1] - y_pixel_offset[0]
xml_outfile = inst_name + "_Definition.xml" det = MantidGeom(inst_name) det.addSnsDefaults() det.addComment("SOURCE AND SAMPLE POSITION") det.addModerator( "msd -0.001*msd-38.980" ) # TODO: change moderator position to read from the excel sheet det.addSamplePosition() det.addComment("MONITORS") det.addMonitors( names=["monitor1", "monitor2", "monitor3"], distance=["msd -0.001*msd-3.340", "msd -0.001*msd-1.59643", "-0.200"]) # TODO: change monitor positions to read from the excel sheet label = "Tank" tank = det.addComponent(label, label, blank_location=False) det.addLocationRTP(tank, "0", "s2 0.0+s2", "0", "0", "s2 0.0+s2", "0") doc_handle = det.makeTypeElement(label) num_dets = len(info["name"]) for i in range(num_dets): det.addComponent(info["name"][i], root=doc_handle) det.addDetector(info["X"][i], info["Y"][i], info["Z"][i], info["RotX"][i], info["RotY"][i], info["RotZ"][i], info["name"][i], "eightpack") det.addComment("STANDARD 8-PACK") det.addNPack("eightpack", info["NUM_TUBES_PER_BANK"], info["TUBE_WIDTH"], info["AIR_GAP_WIDTH"]) det.addComment("STANDARD 1.2m 128 PIXEL TUBE") det.addPixelatedTube("tube", info["NUM_PIXELS_PER_TUBE"],
t = pi - t r += 2 * analyser return tocartesian(r, t, p) geometry = MantidGeom(instrument_name, comment=comment, valid_from=valid_from) geometry.addSnsDefaults(indirect=args.geometrytype != 'N') geometry.addSamplePosition() geometry.addModerator(distance=ch12, name="chopper") geometry.addMonitors(names=["monitor"], distance=[mon], neutronic=args.geometrytype != 'N') geometry.addDummyMonitor(0.001, 0.001) geometry.addMonitorIds([0]) geometry.addComponent("single_detectors", "single_detectors", blank_location=False) sds = geometry.makeTypeElement("single_detectors") sdc = geometry.addComponent("single_pixel", root=sds) for i in range(len(SD_azimuths)): t = SD_azimuths[i] * pi / 180. x = sd * sin(t) y = 0. z = -sd * cos(t) nx, ny, nz = mirror(x, y, z, sd_analyser) if args.geometrytype == 'N': geometry.addLocation(root=sdc, x=nx, y=ny, z=nz, name="single_tube_{0}".format(i + 1))
def main(): from helper import MantidGeom inst_name = "VISION" xml_outfile = inst_name+"_Definition.xml" det = MantidGeom(inst_name, comment=" Created by Stuart Campbell ") det.addSnsDefaults(indirect=True) det.addComment("SOURCE AND SAMPLE POSITION") det.addModerator(-16.0) det.addSamplePosition() # Backscattering Banks are 21-100 BACKSCATTERING_NTUBES = 80 det.addComponent("elastic-backscattering", "elastic-backscattering") handle = det.makeTypeElement("elastic-backscattering") idlist = [] for k in range(BACKSCATTERING_NTUBES): id_start = 26624+(256*k) id_end = 26624 + (256*k) + 255 angle = -(2.25 + 4.5*k) bankid = 21 + k bank_name = "bank%d" % bankid det.addComponent(bank_name, root=handle) z_coord = -0.998 if k%2 == 0: # Even tube number (long) centre_offset = BS_ELASTIC_LONG_TUBE_INNER_RADIUS + (BS_ELASTIC_LONG_TUBE_LENGTH/2.0) #centre_offset = BS_ELASTIC_LONG_TUBE_INNER_RADIUS component_name = "tube-long-bs-elastic" else: # Odd tube number (short) centre_offset = BS_ELASTIC_SHORT_TUBE_INNER_RADIUS + (BS_ELASTIC_SHORT_TUBE_LENGTH/2.0) component_name = "tube-short-bs-elastic" x_coord = centre_offset * math.cos(math.radians(90-angle)) y_coord = centre_offset * math.sin(math.radians(90-angle)) det.addDetector(x_coord, y_coord, z_coord, 0, 0, -angle, bank_name, component_name) idlist.append(id_start) idlist.append(id_end) idlist.append(None) det.addDetectorIds("elastic-backscattering", idlist) # 90 elastic banks elastic_banklist = [3,6,9,12,15,18] elastic_bank_start = [2048,6144,10240,14336,18432,22528] elastic_angle = [22.5,-22.5,-67.5,-112.5,-157.5,157.5] sample_elastic_distance = 0.635 det.addComponent("elastic", "elastic") handle = det.makeTypeElement("elastic") idlist = [] elastic_index = 0 for i in elastic_banklist: bank_name = "bank%d" % i det.addComponent(bank_name, root=handle) z_coord = 0.0 x_coord = sample_elastic_distance * math.cos(math.radians(elastic_angle[elastic_index])) y_coord = sample_elastic_distance * math.sin(math.radians(elastic_angle[elastic_index])) det.addDetector(x_coord, y_coord, z_coord, -90.0, 0, 0., bank_name, "eightpack-elastic", facingSample=True) idlist.append(elastic_bank_start[elastic_index]) idlist.append(elastic_bank_start[elastic_index]+2047) idlist.append(None) elastic_index += 1 det.addDetectorIds("elastic", idlist) # Inelastic inelastic_banklist = [1,2,4,5,7,8,10,11,13,14,16,17,19,20] inelastic_bank_start=[0,1024,4096,5120,8192,9216,12288,13312,16384,17408,20480,21504,24576,25600] inelastic_angle = [45.0,45.0,0.0,0.0,-45.0,-45.0,-90.0,-90.0,-135.0,-135.0,180.0,180.0,135.0,135.0] inelastic_angle_for_rotation = [-45.0,-45.0,180.0,180.0,-135.0,-135.0,-90.0,-90.0,-225.0,-225.0,0.0,0.0,45.0,45.0] sample_inelastic_distance = 0.5174 det.addComponent("inelastic", "inelastic") handle = det.makeTypeElement("inelastic") idlist = [] inelastic_index = 0 for i in inelastic_banklist: bank_name = "bank%d" % i bank_comp = det.addComponent(bank_name, root=handle, blank_location=True) # location_element = le.SubElement(bank_comp, "location") # le.SubElement(location_element, "rot", **{"val":"90", "axis-x":"0", # "axis-y":"0", "axis-z":"1"}) # Neutronic Positions z_coord_neutronic = sample_inelastic_distance * math.tan(math.radians(45.0)) if inelastic_index % 2 == 0: # Facing Downstream z_coord = 0.01 else: # Facing to Moderator z_coord = -0.01 z_coord_neutronic = -z_coord_neutronic # Physical Positions x_coord = sample_inelastic_distance * math.cos(math.radians(inelastic_angle[inelastic_index])) y_coord = sample_inelastic_distance * math.sin(math.radians(inelastic_angle[inelastic_index])) det.addDetector(-x_coord, y_coord, z_coord, 0, 0, inelastic_angle_for_rotation[inelastic_index]-90.0, bank_name, "eightpack-inelastic", neutronic=True, nx=-x_coord, ny=y_coord, nz=z_coord_neutronic) efixed = ("Efixed", "3.64", "meV") det.addDetectorParameters(bank_name, efixed ) idlist.append(inelastic_bank_start[inelastic_index]) idlist.append(inelastic_bank_start[inelastic_index]+1023) idlist.append(None) inelastic_index += 1 det.addDetectorIds("inelastic", idlist) # 8 packs det.addComment("INELASTIC 8-PACK") det.addNPack("eightpack-inelastic", INELASTIC_TUBES_PER_BANK, INELASTIC_TUBE_WIDTH, INELASTIC_AIR_GAP, "tube-inelastic", neutronic=True) det.addComment("ELASTIC 8-PACK") det.addNPack("eightpack-elastic", ELASTIC_TUBES_PER_BANK, ELASTIC_TUBE_WIDTH, ELASTIC_AIR_GAP, "tube-elastic", neutronic=True, neutronicIsPhysical=True) # TUBES det.addComment("INELASTIC TUBE") det.addPixelatedTube("tube-inelastic", INELASTIC_TUBE_NPIXELS, INELASTIC_TUBE_LENGTH, "pixel-inelastic-tube", neutronic=True) det.addComment("BACKSCATTERING LONG TUBE") det.addPixelatedTube("tube-long-bs-elastic", BS_ELASTIC_LONG_TUBE_NPIXELS, BS_ELASTIC_LONG_TUBE_LENGTH, "pixel-bs-elastic-long-tube", neutronic=True, neutronicIsPhysical=True) det.addComment("BACKSCATTERING SHORT TUBE") det.addPixelatedTube("tube-short-bs-elastic", BS_ELASTIC_SHORT_TUBE_NPIXELS, BS_ELASTIC_SHORT_TUBE_LENGTH, "pixel-bs-elastic-short-tube", neutronic=True, neutronicIsPhysical=True) det.addComment("ELASTIC TUBE (90 degrees)") det.addPixelatedTube("tube-elastic", ELASTIC_TUBE_NPIXELS, ELASTIC_TUBE_LENGTH, "pixel-elastic-tube", neutronic=True, neutronicIsPhysical=True) # PIXELS det.addComment("PIXEL FOR INELASTIC TUBES") det.addCylinderPixel("pixel-inelastic-tube", (0.0, 0.0, 0.0), (0.0, 1.0, 0.0), (INELASTIC_TUBE_WIDTH/2.0), (INELASTIC_TUBE_LENGTH/INELASTIC_TUBE_NPIXELS)) det.addComment("PIXEL FOR BACKSCATTERING ELASTIC TUBES (LONG)") det.addCylinderPixel("pixel-bs-elastic-long-tube", (0.0, 0.0, 0.0), (0.0, 1.0, 0.0), (BS_ELASTIC_LONG_TUBE_WIDTH/2.0), (BS_ELASTIC_LONG_TUBE_LENGTH/BS_ELASTIC_LONG_TUBE_NPIXELS)) det.addComment("PIXEL FOR BACKSCATTERING ELASTIC TUBES (SHORT)") det.addCylinderPixel("pixel-bs-elastic-short-tube", (0.0, 0.0, 0.0), (0.0, 1.0, 0.0), (BS_ELASTIC_SHORT_TUBE_WIDTH/2.0), (BS_ELASTIC_SHORT_TUBE_LENGTH/BS_ELASTIC_SHORT_TUBE_NPIXELS)) det.addComment("PIXEL FOR ELASTIC TUBES (90 degrees)") det.addCylinderPixel("pixel-elastic-tube", (0.0, 0.0, 0.0), (0.0, 1.0, 0.0), (ELASTIC_TUBE_WIDTH/2.0), (ELASTIC_TUBE_LENGTH/ELASTIC_TUBE_NPIXELS)) det.addComment(" ##### MONITORS ##### ") det.addMonitors(names=["monitor1"], distance=["-6.71625"], neutronic=True) # MONITORS det.addComment("MONITOR SHAPE") det.addComment("FIXME: Do something real here.") det.addDummyMonitor(0.01, 0.03) det.addComment("MONITOR IDs") det.addMonitorIds(["-1"]) det.showGeom() det.writeGeom(xml_outfile)
}, pixel_radius=pixelRadius, pixel_height=pixelHeight, algebra='pixel_shape') root = geometry.getRoot() detectorType = le.SubElement(root, 'type', name='detector') tubes = le.SubElement(detectorType, 'component', type='tube') for tubeIndex, tubeAngle in enumerate(tubeAngles): x = l2 * np.sin(-np.deg2rad(tubeAngle)) z = l2 * np.cos(np.deg2rad(tubeAngle)) attributes = { 'x': str(x), 'y': str(0.), 'z': str(z), 'name': 'tube_{}'.format(tubeIndex + 1) } le.SubElement(tubes, 'location', **attributes) tubeType = le.SubElement(root, 'type', name='tube', outline='yes') tube = le.SubElement(tubeType, 'component', type='pixel') tube_bottom_pos = -(equator - 1) * pixelHeight tube_top_pos = (numberOfPixelsPerTube - equator) * pixelHeight pixelPositions = np.linspace(tube_bottom_pos, tube_top_pos, numberOfPixelsPerTube) for i, pos in enumerate(pixelPositions): le.SubElement(tube, 'location', y=str(pos), name='pixel_{}'.format(i + 1)) detector = geometry.addComponent('detector', idlist='detectors') le.SubElement(detector, 'location') geometry.addDetectorIds('detectors', [1, numberOfTubes * numberOfPixelsPerTube, None]) geometry.writeGeom("./ILL/IDF/" + instrumentName + "_Definition.xml")
# on the same sides of the arrays for all banks. remove_ghosts = slice(-8) for i in range(banks): pixel_id = nfile["/entry/instrument/bank%d/pixel_id" % (i+1)].value[remove_ghosts] distance = nfile["/entry/instrument/bank%d/distance" % (i+1)].value[remove_ghosts] polar_angle = nfile["/entry/instrument/bank%d/polar_angle" % (i+1)].value[remove_ghosts] polar_angle *= (180.0/math.pi) azimuthal_angle = nfile["/entry/instrument/bank%d/azimuthal_angle" % (i+1)].value[remove_ghosts] azimuthal_angle *= (180.0/math.pi) analyser_wavelength = nfile["/entry/instrument/analyzer%d/wavelength" % (i+1)].value[remove_ghosts] analyser_energy = 81.8042051/analyser_wavelength**2 bank_id = "bank%d" % (i+1) det.addComponent(bank_id, bank_id) #doc_handle = det.makeTypeElement(bank_id) det.addDetectorPixels(bank_id, r=distance, theta=polar_angle, phi=azimuthal_angle, names=pixel_id, energy=analyser_energy) det.addDetectorPixelsIdList(bank_id, r=distance, names=pixel_id) # Create the diffraction bank information det.addComponent("elastic", "elastic") handle = det.makeTypeElement("elastic") idlist = [] detector_z = [-2.1474825,-1.704594,-1.108373,-0.4135165,0.3181,1.0218315,1.6330115,2.0993535,2.376999]
""" # guides - not even copying the text # mapping of groups to column names cols = { 4: ['B'], 3: ['C', 'D'], 2: ['E', 'F'], 1: ['G', 'H', 'I', 'J', 'K', 'L'] } # add the empty components for i in cols.keys(): name = "Group%d" % i group = instr.addComponent(name) #, idlist=name) # add the columns to the group for groupNum in cols.keys(): name = "Group%d" % groupNum group = instr.makeTypeElement(name) for column in cols[groupNum]: name = "Column%d" % ("ABCDEFGHIJKL".index(column) + 1) instr.addComponent(name, root=group) # the actual work of adding the detectors corners = CornersFile("PG3_geom_2013_txt.csv", abs(L1)) addGroup(corners, cols[4], ["B2", "B3", "B4", "B5", "B6"]) addGroup(corners, cols[3], ['C2', 'C3', 'C4', 'C5', 'C6', 'D2', 'D3', 'D4', 'D5', 'D6'])
def generate_reflection_file(reflection_key): r""" Parameters ---------- reflection_key: str Returns ------- """ refl = reflections[reflection_key] if not os.path.exists(refl['nexus']): message = '{} not found. Not creating geometry'.format(refl['nexus']) raise FileExistsError(message) inst_name = "BASIS" # Set header information comment = "Created by Michael Reuter and Jose Borreguero" # Time needs to be in UTC? valid_from = "2014-01-01 00:00:00" xml_outfile = '{}_Definition_Si{}.xml'.format(inst_name, reflection_key) nfile = h5py.File(refl['nexus'], 'r') det = MantidGeom(inst_name, comment=comment, valid_from=valid_from) det.addSnsDefaults(indirect=True) det.addComment("SOURCE AND SAMPLE POSITION") det.addModerator(-84.0) det.addSamplePosition() det.addComment("MONITORS") det.addMonitors(names=["monitor1"], distance=["-0.23368"], neutronic=True) # Create the inelastic banks information det.addComment('INELASTIC DECTECTORS') det.addComponent('silicon') handle_silicon = det.makeTypeElement("silicon") # Slicer for removing ghosts. Due to the mapping, the ghost tubes sit # on the same sides of the arrays for all banks. remove_ghosts = slice(-INELASTIC_TUBES_NGHOST) for i in range(n_inelastic_banks): bank_id = "bank%d" % (i+1) pixel_id = nfile["/entry/instrument/bank%d/pixel_id" % (i+1)].value[remove_ghosts] distance = nfile["/entry/instrument/bank%d/distance" % (i+1)].value[remove_ghosts] # theta or polar_angle: angle from the Z-axis towards the X-axis polar_angle = nfile["/entry/instrument/bank%d/polar_angle" % (i+1)].value[remove_ghosts] polar_angle *= (180.0/math.pi) # phi or azimuthal_angle: angle in the XY-plane azimuthal_angle = nfile["/entry/instrument/bank%d/azimuthal_angle" % (i+1)].value[remove_ghosts] azimuthal_angle *= (180.0/math.pi) analyser_wavelength = nfile["/entry/instrument/analyzer%d/wavelength" % (i+1)].value[remove_ghosts] analyser_wavelength *= refl['ratio_to_irreducible_hkl'] analyser_energy = 81.8042051/analyser_wavelength**2 det.addComponent(bank_id, idlist=bank_id, root=handle_silicon) xbank, ybank, zbank = pixels_physical_xyz(i) det.addDetectorPixels(bank_id, x=xbank, y=ybank, z=zbank, names=pixel_id, energy=analyser_energy, nr=distance, ntheta=polar_angle, nphi=azimuthal_angle, output_efixed=refl['efixed']) det.addDetectorPixelsIdList(bank_id, r=distance, names=pixel_id, elg="multiple_ranges") # Create the diffraction bank information det.addComponent("elastic", "elastic") handle = det.makeTypeElement("elastic") idlist = [] detector_z = [-2.1474825, -1.704594, -1.108373, -0.4135165, 0.3181, 1.0218315, 1.6330115, 2.0993535, 2.376999] detector_x = [1.1649855, 1.7484015, 2.175541, 2.408594, 2.422933, 2.216378, 1.8142005, 1.247867, 0.5687435] detector_y = [-0.001807, -0.001801, -0.0011845, -0.0006885, -0.0013145, -0.001626, -0.001397, 0.0003465, -0.0001125] for i in range(ELASTIC_BANK_START, ELASTIC_BANK_END+1): bank_name = "bank%d" % i det.addComponent(bank_name, root=handle) k = i - ELASTIC_BANK_START x_coord = detector_x[k] y_coord = detector_y[k] z_coord = detector_z[k] det.addDetector(x_coord, y_coord, z_coord, 0.0, 0., 90., bank_name, "tube-elastic", facingSample=True) idlist.append(ELASTIC_DETECTORID_START + ELASTIC_TUBE_NPIXELS*(i-ELASTIC_BANK_START)) idlist.append(ELASTIC_DETECTORID_START + ELASTIC_TUBE_NPIXELS*(i-ELASTIC_BANK_START) + ELASTIC_TUBE_NPIXELS-1) idlist.append(None) # Diffraction tube information det.addComment("ELASTIC TUBE (90 degrees)") det.addPixelatedTube("tube-elastic", ELASTIC_TUBE_NPIXELS, ELASTIC_TUBE_LENGTH, "pixel-elastic-tube", neutronic=True, neutronicIsPhysical=True) # Set the diffraction pixel Ids det.addDetectorIds("elastic", idlist) # Creating diffraction pixel det.addComment("PIXEL FOR DIFFRACTION TUBES") det.addCylinderPixel("pixel-elastic-tube", (0.0, 0.0, 0.0), (0.0, 1.0, 0.0), (ELASTIC_TUBE_WIDTH/2.0), (ELASTIC_TUBE_LENGTH/ELASTIC_TUBE_NPIXELS)) det.addComment("PIXEL FOR INELASTIC TUBES") det.addCylinderPixel("pixel", (0.0, 0.0, 0.0), (0.0, 1.0, 0.0), INELASTIC_TUBE_WIDTH * (1.0-INELASTIC_PIXEL_RADIUS_GAP_RATIO) / 2.0, INELASTIC_TUBE_LENGTH * (1.0-INELASTIC_PIXEL_HEIGHT_GAP_RATIO) / INELASTIC_TUBE_NPIXEL, is_type="detector", algebra="cyl-approx") det.addComment("MONITOR SHAPE") det.addComment("FIXME: Do something real here.") det.addDummyMonitor(0.01, 0.03) det.addComment("MONITOR IDs") det.addMonitorIds(["-1"]) det.writeGeom(xml_outfile) # Always clean after yourself nfile.close()
def main(): from helper import MantidGeom inst_name = "VISION" xml_outfile = inst_name+"_Definition.xml" comment = " Created by Stuart Campbell " valid_from = "2013-10-21 00:00:01" det = MantidGeom(inst_name, comment=comment, valid_from=valid_from) det.addSnsDefaults(indirect=True) det.addComment("SOURCE AND SAMPLE POSITION") det.addModerator(-16.0) det.addSamplePosition() # Backscattering Banks are 21-100 BACKSCATTERING_NTUBES = 80 BACKSCATTERING_SECTORS = 10 TUBES_PER_SECTOR = BACKSCATTERING_NTUBES / BACKSCATTERING_SECTORS PIXELS_PER_SECTOR = TUBES_PER_SECTOR * 256 det.addComponent("elastic-backscattering", "elastic-backscattering") handle = det.makeTypeElement("elastic-backscattering") idlist = [] for k in range(BACKSCATTERING_SECTORS): bankid = 15 + k bank_name = "bank%d" % bankid #doc_handle = det.makeDetectorElement(bank_name, root=handle) z_coord = -0.998 id_start = 14336 + (PIXELS_PER_SECTOR * k) id_end = 14336 + (PIXELS_PER_SECTOR * k) + PIXELS_PER_SECTOR - 1 for l in range(TUBES_PER_SECTOR): tube_index = (k*TUBES_PER_SECTOR) + l tube_name = bank_name + "-tube" + str(tube_index+1) #det.addComponent(tube_name, root=doc_handle) det.addComponent(tube_name, root=handle) angle = -(2.25 + 4.5*tube_index) if tube_index%2 == 0: # Even tube number (long) centre_offset = BS_ELASTIC_LONG_TUBE_INNER_RADIUS + (BS_ELASTIC_LONG_TUBE_LENGTH/2.0) #centre_offset = BS_ELASTIC_LONG_TUBE_INNER_RADIUS component_name = "tube-long-bs-elastic" else: # Odd tube number (short) centre_offset = BS_ELASTIC_SHORT_TUBE_INNER_RADIUS + (BS_ELASTIC_SHORT_TUBE_LENGTH/2.0) component_name = "tube-short-bs-elastic" x_coord = centre_offset * math.cos(math.radians(90-angle)) y_coord = centre_offset * math.sin(math.radians(90-angle)) det.addDetector( x_coord, y_coord, z_coord, 0, 0, -angle, tube_name, component_name) idlist.append(id_start) idlist.append(id_end) idlist.append(None) det.addDetectorIds("elastic-backscattering", idlist) # 90 elastic banks elastic_banklist = [25,26,27,28,29,30] elastic_bank_start = [34816,36864,38912,40960,43008,45056] elastic_angle = [157.5,-157.5,-67.5,-112.5,-22.5,22.5] sample_elastic_distance = 0.635 det.addComponent("elastic", "elastic") handle = det.makeTypeElement("elastic") idlist = [] elastic_index = 0 for i in elastic_banklist: bank_name = "bank%d" % i det.addComponent(bank_name, root=handle) z_coord = 0.0 x_coord = sample_elastic_distance * math.cos(math.radians(elastic_angle[elastic_index])) y_coord = sample_elastic_distance * math.sin(math.radians(elastic_angle[elastic_index])) det.addDetector(x_coord, y_coord, z_coord, -90.0, 180, 0., bank_name, "eightpack-elastic", facingSample=True) idlist.append(elastic_bank_start[elastic_index]) idlist.append(elastic_bank_start[elastic_index]+2047) idlist.append(None) elastic_index += 1 det.addDetectorIds("elastic", idlist) # Inelastic inelastic_banklist = [1,2,3,4,5,6,7,8,9,10,11,12,13,14] inelastic_bank_start=[0,1024,2048,3072,4096,5120,6144,7168,8192,9216,10240,11264,12288,13312] inelastic_angle = [45.0,0.0,-45.0,-90.0,-135.0,-180.0,135.0,45.0,0.0,-45.0,-90.0,-135.0,-180.0,135.0] inelastic_angle_for_rotation = [-45.0,180.0,-135.0,-90.0,-225.0,0.0,45.0,-45.0,180.0,-135.0,-90.0,-225.0,0.0,45.0] sample_inelastic_distance = 0.5174 det.addComponent("inelastic", "inelastic") handle = det.makeTypeElement("inelastic") idlist = [] inelastic_index = 0 for i in inelastic_banklist: bank_name = "bank%d" % i bank_comp = det.addComponent(bank_name, root=handle, blank_location=True) # location_element = le.SubElement(bank_comp, "location") # le.SubElement(location_element, "rot", **{"val":"90", "axis-x":"0", # "axis-y":"0", "axis-z":"1"}) # Neutronic Positions z_coord_neutronic = sample_inelastic_distance * math.tan(math.radians(45.0)) if inelastic_index+1 > 7: # Facing Downstream z_coord = -0.01 else: # Facing to Moderator z_coord = 0.01 z_coord_neutronic = -z_coord_neutronic # Physical Positions x_coord = sample_inelastic_distance * math.cos(math.radians(inelastic_angle[inelastic_index])) y_coord = sample_inelastic_distance * math.sin(math.radians(inelastic_angle[inelastic_index])) det.addDetector(-x_coord, y_coord, z_coord, 0, 0, inelastic_angle_for_rotation[inelastic_index]-90.0, bank_name, "eightpack-inelastic", neutronic=True, nx=-x_coord, ny=y_coord, nz=z_coord_neutronic) efixed = ("Efixed", "3.64", "meV") det.addDetectorParameters(bank_name, efixed ) idlist.append(inelastic_bank_start[inelastic_index]) idlist.append(inelastic_bank_start[inelastic_index]+1023) idlist.append(None) inelastic_index += 1 det.addDetectorIds("inelastic", idlist) # 8 packs det.addComment("INELASTIC 8-PACK") det.addNPack("eightpack-inelastic", INELASTIC_TUBES_PER_BANK, INELASTIC_TUBE_WIDTH, INELASTIC_AIR_GAP, "tube-inelastic", neutronic=True) det.addComment("ELASTIC 8-PACK") det.addNPack("eightpack-elastic", ELASTIC_TUBES_PER_BANK, ELASTIC_TUBE_WIDTH, ELASTIC_AIR_GAP, "tube-elastic", neutronic=True, neutronicIsPhysical=True) # TUBES det.addComment("INELASTIC TUBE") det.addPixelatedTube("tube-inelastic", INELASTIC_TUBE_NPIXELS, INELASTIC_TUBE_LENGTH, "pixel-inelastic-tube", neutronic=True) det.addComment("BACKSCATTERING LONG TUBE") det.addPixelatedTube("tube-long-bs-elastic", BS_ELASTIC_LONG_TUBE_NPIXELS, BS_ELASTIC_LONG_TUBE_LENGTH, "pixel-bs-elastic-long-tube", neutronic=True, neutronicIsPhysical=True) det.addComment("BACKSCATTERING SHORT TUBE") det.addPixelatedTube("tube-short-bs-elastic", BS_ELASTIC_SHORT_TUBE_NPIXELS, BS_ELASTIC_SHORT_TUBE_LENGTH, "pixel-bs-elastic-short-tube", neutronic=True, neutronicIsPhysical=True) det.addComment("ELASTIC TUBE (90 degrees)") det.addPixelatedTube("tube-elastic", ELASTIC_TUBE_NPIXELS, ELASTIC_TUBE_LENGTH, "pixel-elastic-tube", neutronic=True, neutronicIsPhysical=True) # PIXELS det.addComment("PIXEL FOR INELASTIC TUBES") det.addCylinderPixel("pixel-inelastic-tube", (0.0, 0.0, 0.0), (0.0, 1.0, 0.0), (INELASTIC_TUBE_WIDTH/2.0), (INELASTIC_TUBE_LENGTH/INELASTIC_TUBE_NPIXELS)) det.addComment("PIXEL FOR BACKSCATTERING ELASTIC TUBES (LONG)") det.addCylinderPixel("pixel-bs-elastic-long-tube", (0.0, 0.0, 0.0), (0.0, 1.0, 0.0), (BS_ELASTIC_LONG_TUBE_WIDTH/2.0), (BS_ELASTIC_LONG_TUBE_LENGTH/BS_ELASTIC_LONG_TUBE_NPIXELS)) det.addComment("PIXEL FOR BACKSCATTERING ELASTIC TUBES (SHORT)") det.addCylinderPixel("pixel-bs-elastic-short-tube", (0.0, 0.0, 0.0), (0.0, 1.0, 0.0), (BS_ELASTIC_SHORT_TUBE_WIDTH/2.0), (BS_ELASTIC_SHORT_TUBE_LENGTH/BS_ELASTIC_SHORT_TUBE_NPIXELS)) det.addComment("PIXEL FOR ELASTIC TUBES (90 degrees)") det.addCylinderPixel("pixel-elastic-tube", (0.0, 0.0, 0.0), (0.0, 1.0, 0.0), (ELASTIC_TUBE_WIDTH/2.0), (ELASTIC_TUBE_LENGTH/ELASTIC_TUBE_NPIXELS)) det.addComment(" ##### MONITORS ##### ") det.addMonitors(names=["monitor1","monitor4"], distance=["-6.71625","0.287"], neutronic=True) # MONITORS det.addComment("MONITOR SHAPE") det.addComment("FIXME: All monitors share the dimensions of monitor4.") det.addCuboidMonitor(0.051,0.054,0.013) det.addComment("MONITOR IDs") det.addMonitorIds(["-1","-4"]) #det.showGeom() det.writeGeom(xml_outfile)
# Time needs to be in UTC? valid_from = "2018-04-01 00:00:00" # Get geometry information file xml_outfile = INST_NAME + "_Definition.xml" det = MantidGeom(INST_NAME, comment=comment, valid_from=valid_from) det.addSnsDefaults(default_view="cylindrical_y") det.addComment("SOURCE AND SAMPLE POSITION") det.addModerator(-3.289, "monochromator") det.addSamplePosition() doc_handle = None for i in range(NUM_DETS): bank = det.addComponent("bank" + str(i + 1), idlist="bank" + str(i + 1), root=doc_handle) log = le.SubElement(bank, "parameter", **{"name": "y"}) le.SubElement( log, "logfile", **{ "id": "HB2C:Mot:detz.RBV", # detz is in mm "eq": "rint(value*100)/100000", # Round to 0.01mm and convert to metres "extract-single-value-as": "mean" }) det_type = "panel" angle = (i) * 15 + 7.5 # Mantid angle -= 0.03125 * 6 # Offset by six pixels
choppersequence="4.185 2.823 4.267 4.248 2.816 2.809 1.388 7.113 1.406 1.41 2.816 4.251 1.403 4.244 5.646 1.43 1.353 1.424 1.429 1.419 1.401 2.803 1.425 2.821 4.262 1.386 7.098 1.403 4.221 4.242 1.332 2.856 4.23 1.437 4.214 7.054 1.423 2.822 2.841 1.38 1.45 2.783 1.446 7.036 1.429 1.384 1.451 1.389 2.847 5.611 1.45 1.379 1.418 1.414 2.866 1.354 1.437 4.225 5.643 2.803 1.444 1.411 2.803 8.488 1.38 5.678 2.838 1.393 2.838 1.411 2.823 4.238 1.379 2.833 2.821 1.402 1.423 1.4 1.421 1.412 8.471 1.415 2.865 1.394 2.805 2.83 4.208 2.851 1.383 2.854 1.299 1.557 4.136 5.692 4.213 1.437 1.345 2.867 2.831 1.426 9.876 4.296 1.388 1.392 1.438 1.376 2.833 1.415 1.42 1.411 1.444 2.789 2.86 5.592 7.069 2.876 9.821 1.417 1.449 1.404 1.41 1.431 1.406 5.642 1.411 2.818 1.405 2.85" det.addChopper("correlation-chopper",-2.000653,["Speed (Hz)","BL9:Chop:Skf4:MotorSpeed"]) det.addCorrelationChopper("correlation-chopper",sequence=choppersequence) det.addDetectorStringParameters("correlation-chopper",("sequence",choppersequence)) row_id = "" row_id_list = [] doc_handle = None for i in range(num_dets): location = detinfo["Location"][i] if row_id != location[0]: row_id = location[0] row_id_list.append(row_id) row_id_str = row_id + " row" det.addComponent(row_id_str, row_id_str) doc_handle = det.makeTypeElement(row_id_str) det.addComponent("bank"+str(i+1), root=doc_handle) xpos = convert(detinfo["Xsci"][i]) ypos = convert(detinfo["Ysci"][i]) zpos = convert(detinfo["Zsci"][i]) det_type = "sixteenpack" det.addDetector(xpos, ypos, zpos, detinfo["Xrot_sci"][i], detinfo["Yrot_sci"][i], detinfo["Zrot_sci"][i], "bank"+str(i+1), det_type) det.addComment("16-PACK") det.addNPack("sixteenpack", NUM_TUBES_PER_BANK, TUBE_WIDTH, AIR_GAP_WIDTH)
det.addMonitors(names=["monitor1"], distance=["-0.23368"]) for i in range(banks): pixel_id = file["/entry/instrument/bank%d/pixel_id" % (i+1)].value distance = file["/entry/instrument/bank%d/distance" % (i+1)].value polar_angle = file["/entry/instrument/bank%d/polar_angle" % (i+1)].value polar_angle *= (180.0/math.pi) azimuthal_angle = file["/entry/instrument/bank%d/azimuthal_angle" % (i+1)].value azimuthal_angle *= (180.0/math.pi) analyser_wavelength = file["/entry/instrument/analyzer%d/wavelength" % (i+1)].value analyser_energy = 81.8042051/analyser_wavelength**2 bank_id = "bank%d" % (i+1) det.addComponent(bank_id, bank_id) #doc_handle = det.makeTypeElement(bank_id) det.addDetectorPixels(bank_id, r=distance, theta=polar_angle, phi=azimuthal_angle, names=pixel_id, energy=analyser_energy) det.addDetectorPixelsIdList(bank_id, r=distance, names=pixel_id) # Pixel Height y_pixel_offset = file["/entry/instrument/bank1/y_pixel_offset"].value pixel_ysize = y_pixel_offset[1] - y_pixel_offset[0] # Pixel Width x_pixel_offset = file["/entry/instrument/bank1/x_pixel_offset"].value pixel_xsize = x_pixel_offset[1] - x_pixel_offset[0]
# Time needs to be in UTC? valid_from = "2018-04-01 00:00:00" # Get geometry information file xml_outfile = INST_NAME+"_Definition.xml" det = MantidGeom(INST_NAME, comment=comment, valid_from=valid_from) det.addSnsDefaults(default_view="cylindrical_y") det.addComment("SOURCE AND SAMPLE POSITION") det.addModerator(-3.289, "monochromator") det.addSamplePosition() doc_handle = None for i in range(NUM_DETS): bank = det.addComponent("bank"+str(i+1), idlist="bank"+str(i+1), root=doc_handle) log = le.SubElement(bank, "parameter", **{"name": "y"}) le.SubElement(log, "logfile", **{"id": "HB2C:Mot:detz.RBV", # detz is in mm "eq": "rint(value*100)/100000", # Round to 0.01mm and convert to metres "extract-single-value-as": "mean"}) det_type = "panel" angle = (i)*15+7.5 # Mantid angle -= 0.03125*6 # Offset by six pixels #angle = i*15+7.5 # Flipped type_element = le.SubElement(det.getRoot(), "type", name="bank"+str(i+1)) comp_element = le.SubElement(type_element, "component",
xml_outfile = inst_name+"_Definition.xml" nfile = h5py.File(nexusfile, 'r') det = MantidGeom(inst_name, comment=comment, valid_from=valid_from) det.addSnsDefaults(indirect=True) det.addComment("SOURCE AND SAMPLE POSITION") det.addModerator(-84.0) det.addSamplePosition() det.addComment("MONITORS") det.addMonitors(names=["monitor1"], distance=["-0.23368"], neutronic=True) # Create the inelastic banks information det.addComment("INELASTIC DECTECTORS") det.addComponent("silicon") handle_silicon = det.makeTypeElement("silicon") # Slicer for removing ghosts. Due to the mapping, the ghost tubes sit # on the same sides of the arrays for all banks. remove_ghosts = slice(-INELASTIC_TUBES_NGHOST) for i in range(banks): pixel_id = nfile["/entry/instrument/bank%d/pixel_id" % (i+1)].value[remove_ghosts] distance = nfile["/entry/instrument/bank%d/distance" % (i+1)].value[remove_ghosts] polar_angle = nfile["/entry/instrument/bank%d/polar_angle" % (i+1)].value[remove_ghosts] polar_angle *= (180.0/math.pi) azimuthal_angle = nfile["/entry/instrument/bank%d/azimuthal_angle" % (i+1)].value[remove_ghosts] azimuthal_angle *= (180.0/math.pi) analyser_wavelength = nfile["/entry/instrument/analyzer%d/wavelength" % (i+1)].value[remove_ghosts] analyser_energy = 81.8042051/analyser_wavelength**2
valid_from="2012-08-01 00:00:01") instr.addComment("DEFAULTS") instr.addSnsDefaults() instr.addComment("SOURCE") instr.addModerator(-19.5) instr.addComment("SAMPLE") instr.addSamplePosition() # monitors instr.addComment("MONITORS") instr.addMonitors([-0.879475, 5.748782], ["monitor1", "monitor2"]) # add the empty components for i in range(1, 7): name = "Group%d" % i instr.addComponent(name, idlist=name) # add the id lists for groups info = instr.addDetectorIds("Group1", makeIds(14, 0, 8 * 128)) info = instr.addDetectorIds("Group2", makeIds(23, 14336, 8 * 128)) info = instr.addDetectorIds("Group3", makeIds(14, 37888, 8 * 128)) info = instr.addDetectorIds("Group4", makeIds(12, 52224, 8 * 128)) info = instr.addDetectorIds("Group5", makeIds(18, 64512, 8 * 128)) info = instr.addDetectorIds("Group6", makeIds(18, 82944, 8 * 128)) # ---------- add in group1 """ ;;;source idl code N_first=14 z0_first=6.41/8.45*3.2 x0_first=1.31/8.45*3.2
valid_from="2012-08-01 00:00:01") instr.addComment("DEFAULTS") instr.addSnsDefaults() instr.addComment("SOURCE") instr.addModerator(-19.5) instr.addComment("SAMPLE") instr.addSamplePosition() # monitors instr.addComment("MONITORS") instr.addMonitors([-0.879475,5.748782], ["monitor1", "monitor2"]) # add the empty components for i in range(1,7): name = "Group%d" % i instr.addComponent(name, idlist=name) # add the id lists for groups info = instr.addDetectorIds("Group1", makeIds(14, 0, 8*128)) info = instr.addDetectorIds("Group2", makeIds(23, 14336, 8*128)) info = instr.addDetectorIds("Group3", makeIds(14, 37888, 8*128)) info = instr.addDetectorIds("Group4", makeIds(12, 52224, 8*128)) info = instr.addDetectorIds("Group5", makeIds(18, 64512, 8*128)) info = instr.addDetectorIds("Group6", makeIds(18, 82944, 8*128)) # ---------- add in group1 """ ;;;source idl code N_first=14 z0_first=6.41/8.45*3.2 x0_first=1.31/8.45*3.2
def generate_reflection_file(reflection_key): r""" Parameters ---------- reflection_key: str Returns ------- """ refl = reflections[reflection_key] if not os.path.exists(refl['nexus']): message = '{} not found. Not creating geometry'.format(refl['nexus']) raise FileExistsError(message) inst_name = "BASIS" # Set header information comment = "Created by Michael Reuter and Jose Borreguero" # Time needs to be in UTC? valid_from = "2014-01-01 00:00:00" xml_outfile = '{}_Definition_Si{}.xml'.format(inst_name, reflection_key) nfile = h5py.File(refl['nexus'], 'r') det = MantidGeom(inst_name, comment=comment, valid_from=valid_from) det.addSnsDefaults(indirect=True) det.addComment("SOURCE AND SAMPLE POSITION") det.addModerator(-84.0) det.addSamplePosition() det.addComment("MONITORS") det.addMonitors(names=["monitor1"], distance=["-0.23368"], neutronic=True) # Create the inelastic banks information det.addComment('INELASTIC DECTECTORS') det.addComponent('silicon') handle_silicon = det.makeTypeElement("silicon") # Slicer for removing ghosts. Due to the mapping, the ghost tubes sit # on the same sides of the arrays for all banks. remove_ghosts = slice(-INELASTIC_TUBES_NGHOST) for i in range(n_inelastic_banks): bank_id = "bank%d" % (i + 1) pixel_id = nfile["/entry/instrument/bank%d/pixel_id" % (i + 1)].value[remove_ghosts] distance = nfile["/entry/instrument/bank%d/distance" % (i + 1)].value[remove_ghosts] # theta or polar_angle: angle from the Z-axis towards the X-axis polar_angle = nfile["/entry/instrument/bank%d/polar_angle" % (i + 1)].value[remove_ghosts] polar_angle *= (180.0 / math.pi) # phi or azimuthal_angle: angle in the XY-plane azimuthal_angle = nfile["/entry/instrument/bank%d/azimuthal_angle" % (i + 1)].value[remove_ghosts] azimuthal_angle *= (180.0 / math.pi) analyser_wavelength = nfile["/entry/instrument/analyzer%d/wavelength" % (i + 1)].value[remove_ghosts] analyser_wavelength *= refl['ratio_to_irreducible_hkl'] analyser_energy = 81.8042051 / analyser_wavelength**2 det.addComponent(bank_id, idlist=bank_id, root=handle_silicon) xbank, ybank, zbank = pixels_physical_xyz(i) det.addDetectorPixels(bank_id, x=xbank, y=ybank, z=zbank, names=pixel_id, energy=analyser_energy, nr=distance, ntheta=polar_angle, nphi=azimuthal_angle, output_efixed=refl['efixed']) det.addDetectorPixelsIdList(bank_id, r=distance, names=pixel_id, elg="multiple_ranges") # Create the diffraction bank information det.addComponent("elastic", "elastic") handle = det.makeTypeElement("elastic") idlist = [] detector_z = [ -2.1474825, -1.704594, -1.108373, -0.4135165, 0.3181, 1.0218315, 1.6330115, 2.0993535, 2.376999 ] detector_x = [ 1.1649855, 1.7484015, 2.175541, 2.408594, 2.422933, 2.216378, 1.8142005, 1.247867, 0.5687435 ] detector_y = [ -0.001807, -0.001801, -0.0011845, -0.0006885, -0.0013145, -0.001626, -0.001397, 0.0003465, -0.0001125 ] for i in range(ELASTIC_BANK_START, ELASTIC_BANK_END + 1): bank_name = "bank%d" % i det.addComponent(bank_name, root=handle) k = i - ELASTIC_BANK_START x_coord = detector_x[k] y_coord = detector_y[k] z_coord = detector_z[k] det.addDetector(x_coord, y_coord, z_coord, 0.0, 0., 90., bank_name, "tube-elastic", facingSample=True) idlist.append(ELASTIC_DETECTORID_START + ELASTIC_TUBE_NPIXELS * (i - ELASTIC_BANK_START)) idlist.append(ELASTIC_DETECTORID_START + ELASTIC_TUBE_NPIXELS * (i - ELASTIC_BANK_START) + ELASTIC_TUBE_NPIXELS - 1) idlist.append(None) # Diffraction tube information det.addComment("ELASTIC TUBE (90 degrees)") det.addPixelatedTube("tube-elastic", ELASTIC_TUBE_NPIXELS, ELASTIC_TUBE_LENGTH, "pixel-elastic-tube", neutronic=True, neutronicIsPhysical=True) # Set the diffraction pixel Ids det.addDetectorIds("elastic", idlist) # Creating diffraction pixel det.addComment("PIXEL FOR DIFFRACTION TUBES") det.addCylinderPixel("pixel-elastic-tube", (0.0, 0.0, 0.0), (0.0, 1.0, 0.0), (ELASTIC_TUBE_WIDTH / 2.0), (ELASTIC_TUBE_LENGTH / ELASTIC_TUBE_NPIXELS)) det.addComment("PIXEL FOR INELASTIC TUBES") det.addCylinderPixel( "pixel", (0.0, 0.0, 0.0), (0.0, 1.0, 0.0), INELASTIC_TUBE_WIDTH * (1.0 - INELASTIC_PIXEL_RADIUS_GAP_RATIO) / 2.0, INELASTIC_TUBE_LENGTH * (1.0 - INELASTIC_PIXEL_HEIGHT_GAP_RATIO) / INELASTIC_TUBE_NPIXEL, is_type="detector", algebra="cyl-approx") det.addComment("MONITOR SHAPE") det.addComment("FIXME: Do something real here.") det.addDummyMonitor(0.01, 0.03) det.addComment("MONITOR IDs") det.addMonitorIds(["-1"]) det.writeGeom(xml_outfile) # Always clean after yourself nfile.close()
aperture1.setHelper("CenteredRectangle") aperture1.addVariable("cenDistance", "slit1Sam") aperture1.addVariable("xExtent", "s1width") aperture1.addVariable("yExtent", "s1height") instrument.addComponent(aperture1) """ # guides - not even copying the text # mapping of groups to column names cols = {4:['B'], 3:['C', 'D'], 2:['E', 'F'], 1:['G', 'H', 'I', 'J', 'K', 'L']} # add the empty components for i in cols.keys(): name = "Group%d" % i group = instr.addComponent(name)#, idlist=name) # add the columns to the group for groupNum in cols.keys(): name = "Group%d" % groupNum group = instr.makeTypeElement(name) for column in cols[groupNum]: name = "Column%d" % ("ABCDEFGHIJKL".index(column) + 1) instr.addComponent(name, root=group) # the actual work of adding the detectors corners = CornersFile("PG3_geom_2013_txt.csv", abs(L1)) addGroup(corners, cols[4], ["B2", "B3", "B4", "B5", "B6"]) addGroup(corners, cols[3], ['C2', 'C3', 'C4', 'C5', 'C6', 'D2', 'D3', 'D4', 'D5', 'D6']) addGroup(corners, cols[2], ['E2', 'E3', 'E4', 'E5', 'F2', 'F3', 'F4', 'F5'])
in16b.addMonitorIds([0]) in16b.addComment("Detector") in16b.addComponentILL("detector", 0, 0, 0) detector = in16b.makeTypeElement("detector") # create tubes id lists for i in range(number_of_tubes): in16b.addDetectorIds("tube_{0}_ids".format(i + 1), [pixel_per_tube * i + 1, pixel_per_tube * (i + 1), 1]) # create standard tube component and place them tube = in16b.makeTypeElement("tube") for i in range(number_of_tubes): current_tube = in16b.addComponent('tube', idlist="tube_{0}_ids".format(i + 1), root=detector) in16b.addLocation(root=current_tube, x=0, y=pow(-1, i) * vertical_offset, z=0, rot_y=-tube_angles[i], name="tube_{0}".format(i + 1)) # add a pixel component to the tube component tube_pixel = in16b.addComponent(root=tube, type_name='pixel') # place pixels on the standard tube component for i in range(pixel_per_tube): in16b.addLocation(root=tube_pixel, x=(pixel_per_tube // 2 - i) / pixel_per_tube *
bank = le.SubElement(root, 'type', name='bank') tubes = le.SubElement(bank, 'component', type='tube') for boxIndex, boxAngle in enumerate(boxAngles): for tubeIndex in range(numberOfTubesPerBox): tubeAngle = boxAngle - boxAngleWidth / 2. + tubeIndex * tubeAngleStep x = l2 * np.sin(np.deg2rad(tubeAngle)) y = tubeVerticalShift z = l2 * np.cos(np.deg2rad(tubeAngle)) attributes = { 'x': str(x), 'y': str(y), 'z': str(z), 'rot': str(tubeAngle), 'axis-x': str(0.), 'axis-y': str(1.), 'axis-z': str(0.), 'name': 'tube_{}'.format(boxIndex * numberOfTubesPerBox + tubeIndex + 1) } le.SubElement(tubes, 'location', **attributes) tubeType = le.SubElement(root, 'type', name='tube', outline='yes') tube = le.SubElement(tubeType, 'component', type='pixel') pixelPositions = np.linspace(-tubeHeight/2., tubeHeight/2., numberOfPixelsPerTube) for pos in pixelPositions: le.SubElement(tube, 'location', y=str(pos)) geometry.addComponent('detectors', idlist='detectors') detectorType = le.SubElement(root, 'type', name='detectors') bankComponent = le.SubElement(detectorType, 'component', type='bank') le.SubElement(bankComponent, 'location') geometry.addDetectorIds('detectors', [1, 73728, None]) geometry.writeGeom("./ILL/IDF/" + instrumentName + "_Definition.xml")
inst_name = "CNCS" detinfo = read_file(geom_input_file) num_dets = len(detinfo.values()[0]) xml_outfile = inst_name+"_Definition.xml" det = MantidGeom(inst_name, comment=comment, valid_from=valid_from) det.addSnsDefaults() det.addComment("SOURCE AND SAMPLE POSITION") det.addModerator(-36.262) det.addSamplePosition() det.addComment("MONITORS") det.addMonitors(names=["monitor1", "monitor2", "monitor3"], distance=["-29.949", "-28.706", "-1.416"]) label = "detectors" det.addComponent(label, label) doc_handle = det.makeTypeElement(label) for i in range(num_dets): det.addComponent(detinfo["name"][i], root=doc_handle) det.addDetector(detinfo["X"][i], detinfo["Y"][i], detinfo["Z"][i], detinfo["RotX"][i], detinfo["RotY"][i], detinfo["RotZ"][i], detinfo["name"][i], "eightpack") det.addComment("STANDARD 8-PACK") det.addNPack("eightpack", NUM_TUBES_PER_BANK, TUBE_WIDTH, AIR_GAP_WIDTH) det.addComment("STANDARD 2m 128 PIXEL TUBE") det.addPixelatedTube("tube", NUM_PIXELS_PER_TUBE, TUBE_SIZE) det.addComment("PIXEL FOR STANDARD 2m 128 PIXEL TUBE")
#for i, key in enumerate(positionsSurvey.keys()): # positions[key] = positionsSurvey[key] num_banks = [14, 23, 14,12, 18, 18] #################### # add the id lists for groups - [start, stop, step] start, stop = -1, -1 for i, num_banks_in_pack in enumerate(num_banks): start = stop+1 stop = start + num_banks_in_pack*8*128-1 info = instr.addDetectorIds('Group%d' % (i+1), [start, stop, None]) for i, _ in enumerate(num_banks): group = 'Group%d' % (i+1) group = instr.addComponent(group, idlist=group) #################### # group 1 is banks 1-14 (inclusive) bank_offset = 0 group = instr.makeTypeElement('Group1') for i in range(num_banks[0]): bank_num = bank_offset + i + 1 bank = "bank%d" % bank_num corners = getCorners(bank_num) rect = getRectangle(bank_num, positions, corners) det = instr.makeDetectorElement('pack', root=group) rect.makeLocation(instr, det, bank) # group 2 is banks 15-37 (inclusive) bank_offset += num_banks[0]
d7.addMonitors(names=["monitor1", "monitor2"], distance=[zMon1, zMon2]) d7.addComment("MONITOR SHAPE") d7.addComment("FIXME: Do something real here.") d7.addDummyMonitor(0.01, 0.03) d7.addComment("MONITOR IDs") d7.addMonitorIds([repr(100000), repr(100001)]) d7.addComment("DETECTORS") d7.addComponentILL("detector", 0., 0., 0.) detector = d7.makeTypeElement("detector") # define detector banks d7.addDetectorIds("bank2_ids", [1, 44, 1]) d7.addDetectorIds("bank3_ids", [45, 88, 1]) d7.addDetectorIds("bank4_ids", [89, 132, 1]) bank = d7.makeTypeElement("bank") bank2 = d7.addComponent("bank", idlist="bank2_ids", root=detector) bank3 = d7.addComponent("bank", idlist="bank3_ids", root=detector) bank4 = d7.addComponent("bank", idlist="bank4_ids", root=detector) # define detector banks initial positions d7.addLocation(root=bank2, x=0, y=0, z=0, rot_y=repr(-(minTwoTheta + 0.5 * numberDetectors)), name="bank2") d7.addLocation(root=bank3, x=0, y=0, z=0, rot_y=repr(-(minTwoTheta + 1.5 * numberDetectors + 2)),