# getting this far means all tests passed return True def __ne__(self, other): """Compare this to another object for inequality""" return not self.__eq__(other) if __name__ == "__main__": inst_name = "NOMAD" xml_outfile = inst_name+"_Definition.xml" # boiler plate stuff instr = MantidGeom(inst_name, comment=" Created by Peter Peterson and Vickie Lynch", 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)
# df = read_survey_measurements() # inst_name = "VULCAN" xml_outfile = f"{inst_name}_Definition_tmp.xml" authors = ["Peter Peterson", "Malcolm Guthrie", "Chen Zhang"] # -- ROOT -- vulcan_geom = MantidGeom( inst_name, comment="Created by " + ", ".join(authors), valid_from="2022-05-15 00:00:01", ) # -- MISC -- vulcan_geom.addComment("DEFAULTS") vulcan_geom.addSnsDefaults() vulcan_geom.addComment("SOURCE") vulcan_geom.addModerator(L1) vulcan_geom.addComment("SAMPLE") vulcan_geom.addSamplePosition() # -- 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.
geom_input_file = "SNS/SEQ/SEQ_geom_19890-.txt" # Set header information comment = "Created by Michael Reuter" # Time needs to be in UTC? valid_from = "2012-04-04 14:15:46" # Get geometry information file 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(-20.0114) det.addSamplePosition() det.addComment("CHOPPERS") det.addChopper("t0-chopper", -10.51) det.addVerticalAxisT0Chopper("t0-chopper") det.addChopper("fermi-chopper", -2.00180) det.addFermiChopper("fermi-chopper") det.addComment("MONITORS") det.addMonitors(names=["monitor1", "monitor2"], distance=["-1.77808", "8.99184"]) row_id = "" row_id_list = [] doc_handle = None for i in range(num_dets):
inst_name = "BASIS" short_name = "BSS" # Set header information comment = "Created by Michael Reuter & Jose Borreguero" # Time needs to be in UTC? valid_from = "2014-01-01 00:00:00" 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]
try: np.set_printoptions(legacy='1.13') except TypeError: pass # Set header information comment = "Created by Ross Whitfield" # 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":
__author__="Stuart Campbell" __date__ ="$Dec 14, 2010 3:13:15 PM$" if __name__ == "__main__": inst_name = "BASIS" short_name = "BSS" xml_outfile = inst_name+"_Definition_new.xml" file = h5py.File(nexusfile, 'r') det = MantidGeom(inst_name, comment=" Created by Stuart Campbell ") det.addSnsDefaults() det.addComment("SOURCE AND SAMPLE POSITION") det.addModerator(-84.0) det.addSamplePosition() det.addComment("MONITORS") 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
Time-of-flight mode: Beam area at sample position 10 mm x 50 mm (width x height) Q-range 0.002 - 2 A-1 Collimation Slits generally do not move (no motor attached) Slit separation 3.4 m Slit 2 to sample distance: 3.605 m Slit 3 to sample distance: 0.205 m For more information, please visit https://www.ill.eu/instruments-support/instruments-groups/instruments/d17/characteristics/ """ d17 = MantidGeom(instrumentName, comment=comment, valid_from=validFrom) d17.addSnsDefaults(theta_sign_axis='x') d17.addComment("SOURCE") d17.addComponentILL("chopper1", 0.0, 0.0, chop1_source, "Source") d17.addComment("Sample position") d17.addComponentILL("sample_position", 0.0, 0.0, 0.0, "SamplePos") d17.addComment("MONITORS") d17.addMonitors(names=["monitor1", "monitor2"], distance=[zMon1, zMon2]) d17.addComment("MONITOR SHAPE") d17.addComment("FIXME: Do something real here.") d17.addDummyMonitor(0.01, 0.03) d17.addComment("MONITOR IDs") d17.addMonitorIds(["100000", "100001"]) d17.addComment("2 Slits") d17.addComponentILL("slit2", 0.0, 0.0, slit2Centre) d17.makeTypeElement("slit2") d17.addComponentILL("slit3", 0.0, 0.0, slit3Centre) d17.makeTypeElement("slit3")
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)
Two detector multi-tube detectors Sample-detector distances range from 1.2 m to 12.8 m Detector 1 (rear): Single panel mono-block size 640 x 640 mm Pixel size 5 x 5 mm^2 ( 128 x 128 pixels ) Detector 2 (front): 4-panel mono-block, size 160 x 640 mm per panel Pixel size 5 x 5 mm^2 ( 32 x 128 pixels ) For more information, please visit https://www.ill.eu/instruments-support/instruments-groups/instruments/d33/characteristics/ """ d33 = MantidGeom(instrumentName, comment=comment, valid_from=validFrom) d33.addSnsDefaults() d33.addComment("SOURCE") d33.addComponentILL("moderator", 0., 0., moderator_source, "Source") d33.addComment("Sample position") d33.addComponentILL("sample_position", 0., 0., 0., "SamplePos") d33.addComment("MONITORS") d33.addMonitors(names=["monitor1", "monitor2"], distance=[zMon1, zMon2]) d33.addComment("MONITOR SHAPE") d33.addComment("FIXME: Do something real here.") d33.addDummyMonitor(0.01, 0.03) d33.addComment("MONITOR IDs") d33.addMonitorIds([repr(500000), repr(500001)]) d33.addComment("DETECTORS") d33.addComponentILL("detector", 0., 0., 0.) detector = d33.makeTypeElement("detector") d33.addComponentRectangularDetector(detector0, 0., 0., zPosRear, idstart=id0, idfillbyfirst=FF, idstepbyrow=SR, root=detector) d33.addComponentILL("front_detector", 0., 0., 0., root=detector)
#individual tube info di["TUBE_SIZE"]=sheet.cell_value(4,8)*1e-3 di["TUBE_WIDTH"]=sheet.cell_value(8,4)*1e-3 di["TUBE_THICKNESS"]=("tube_thickness",sheet.cell_value(7,8)*1e-3,"meter") di["TUBE_PRESSURE"]=("tube_pressure",10.0,"atm") di["TUBE_TEMPERATURE"]=("tube_temperature",290.0,"K") return di 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],
__author__ = "Stuart Campbell" __date__ = "$Dec 14, 2010 3:13:15 PM$" if __name__ == "__main__": inst_name = "BASIS" short_name = "BSS" xml_outfile = inst_name + "_Definition_new.xml" file = h5py.File(nexusfile, 'r') det = MantidGeom(inst_name, comment=" Created by Stuart Campbell ") det.addSnsDefaults() det.addComment("SOURCE AND SAMPLE POSITION") det.addModerator(-84.0) det.addSamplePosition() det.addComment("MONITORS") 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)
xstart_right = repr(-center_pixel_y * (number_of_pixels_per_tube - 1) / 2 - x_gap) xstep_right = xstep_left xpixels_right = xpixels_left ystart_right = ystart_left ystep_right = ystep_left ypixels_right = ypixels_left comment = """ This is the instrument definition file of the D11B SANS instrument at the ILL. Generated file, PLEASE DO NOT EDIT THIS FILE! This file was automatically generated by mantidgeometry/ILL/IDF/d11b_generateIDF.py > python3 ./ILL/IDF/d11b_generateIDF.py """ d11b = MantidGeom(instrument_name, comment=comment, valid_from=valid_from) d11b.addSnsDefaults(default_view='3D', axis_view_3d='z-') d11b.addComment("SOURCE") d11b.addComponentILL("monochromator", 0., 0., monochromator_source, "source") d11b.addComment("Sample position") d11b.addComponentILL("sample_position", 0., 0., 0., "SamplePos") d11b.addComment("MONITORS") d11b.addMonitors(names=["monitor1", "monitor2"], distance=[zMon1, zMon2]) d11b.addComment("MONITOR SHAPE") d11b.addDummyMonitor(0.01, 0.03) d11b.addComment("MONITOR IDs") d11b.addMonitorIds([repr(100000), repr(100001)]) d11b.addComment("DETECTORS") d11b.addComponentILL("detector", 0., 0., 0.) detector = d11b.makeTypeElement("detector") d11b.addComponentRectangularDetector(detector0, 0., 0.,
di["TUBE_WIDTH"] = sheet.cell_value(8, 4) * 1e-3 di["TUBE_THICKNESS"] = ("tube_thickness", sheet.cell_value(7, 8) * 1e-3, "meter") di["TUBE_PRESSURE"] = ("tube_pressure", 10.0, "atm") di["TUBE_TEMPERATURE"] = ("tube_temperature", 290.0, "K") return di 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"])
128 x 256 Pixel size 8 x 4 mm2 Low resolution: 128 x 128 Pixel size 8 x 8 mm2 Right detector: Same orientation of tubes, same size of pixels Only 96 tubes instead of 128 tubes in the main detector For more information, please visit https://www.ill.eu/instruments-support/instruments-groups/instruments/d22/characteristics/ """ d22 = MantidGeom(instrumentName, comment=comment, valid_from=validFrom) d22.addSnsDefaults(default_view='3D',axis_view_3d='z-') d22.addComment("SOURCE") d22.addComponentILL("moderator", 0., 0., moderator_source, "Source") d22.addComment("Sample position") d22.addComponentILL("sample_position", 0., 0., 0., "SamplePos") d22.addComment("MONITORS") d22.addMonitors(names=["monitor1", "monitor2"], distance=[zMon1, zMon2]) d22.addComment("MONITOR SHAPE") d22.addDummyMonitor(0.01, 0.03) d22.addComment("MONITOR IDs") d22.addMonitorIds([repr(100000), repr(100001)]) d22.addComment("DETECTOR") d22.addComponentILL("detector", 0., 0., 0.) detector = d22.makeTypeElement("detector") d22.addComponentRectangularDetector(detector0, 0., 0., zPos, idstart=id0, idfillbyfirst=FF, idstepbyrow=SR, root=detector) d22.addComponentRectangularDetector(detector1, -right_center_offset, 0., zPos-z_gap, idstart=id1, idfillbyfirst=FF, idstepbyrow=SR, root=detector) d22.addRectangularDetector(detector0, pixelName, xstart, xstep, xpixels, ystart, ystep, ypixels)
# funny ordering copied from TS return Rectangle(three, four, one, two, tolerance_len=tolerance_len) if __name__ == "__main__": inst_name = "PG3" xml_outfile = inst_name + "_Definition.xml" authors = [ "Stuart Campbell", "Vickie Lynch", "Peter Peterson", "Janik Zikovsky" ] # boiler plate stuff instr = MantidGeom(inst_name, comment="Created by " + ", ".join(authors), valid_from="2013-08-01 00:00:01") instr.addComment("DEFAULTS") instr.addSnsDefaults() instr.addComment("SOURCE") instr.addModerator(L1) instr.addComment("SAMPLE") instr.addSamplePosition() # monitors instr.addComment("MONITORS") instr.addMonitors([-1.], ["monitor1"]) #instr.addMonitors([L1+59., L1+62.5, L1+64], ["monitor1", "monitor2", "monitor3"]) # choppers - copied verbatium from TS-geometry """ chopper1 = Component("chopper1", "NXchopper") chopper1.setComment("CHOPPERS")
positions = {} for i, x_i,y_i,z_i in zip(id, x,y,z): if x_i == 0. and y_i == 0. and z_i == 0: continue positions[i] = Vector(x_i, y_i, z_i) return positions if __name__ == "__main__": inst_name = "NOMAD" xml_outfile = inst_name+"_Definition.xml" # boiler plate stuff instr = MantidGeom(inst_name, comment=" Created by Peter Peterson", valid_from="2017-06-05 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.addMonitorIds([-1,-2]) instr.addMonitors([-0.879475,5.748782], ["monitor1", "monitor2"]) instr.addComment("Shape for monitors") instr.addComment("TODO: Update to real shape") instr.addDummyMonitor(0.01, .03)
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)
if x_i == 0. and y_i == 0. and z_i == 0: continue # subtract off distance to source from z values positions[i] = Vector(x_i, y_i, z_i - 19.5) return positions if __name__ == "__main__": inst_name = "NOMAD" xml_outfile = inst_name + "_Definition.xml" # boiler plate stuff instr = MantidGeom(inst_name, comment=" Created by Peter Peterson", valid_from="2022-05-05 00:00:01") instr.addComment("DEFAULTS") instr.addSnsDefaults(theta_sign_axis="x") instr.addComment("SOURCE") instr.addModerator(-19.5) instr.addComment("SAMPLE") instr.addSamplePosition() # monitors instr.addComment("MONITORS") instr.addMonitorIds([-1, -2]) instr.addMonitors([-0.879475, 5.748782], ["monitor1", "monitor2"]) instr.addComment("Shape for monitors") instr.addComment("TODO: Update to real shape") instr.addDummyMonitor(0.01, .03) # TODO choppers and slits could go here
try: np.set_printoptions(legacy='1.13') except TypeError: pass # Set header information comment = "Created by Ross Whitfield" # 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"
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)
return True def __ne__(self, other): """Compare this to another object for inequality""" return not self.__eq__(other) if __name__ == "__main__": inst_name = "NOMAD" xml_outfile = inst_name + "_Definition.xml" # boiler plate stuff instr = MantidGeom(inst_name, comment=" Created by Peter Peterson and Vickie Lynch", 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)
Multi-detector: Size 1024 mm x 1024 mm Nominal resolution: 128 x 256 Pixel size 8 x 4 mm2 Low resolution: 128 x 128 Pixel size 8 x 8 mm2 For more information, please visit https://www.ill.eu/instruments-support/instruments-groups/instruments/d22/characteristics/ """ d22 = MantidGeom(instrumentName, comment=comment, valid_from=validFrom) d22.addSnsDefaults(default_view='3D',axis_view_3d='z-') d22.addComment("SOURCE") d22.addComponentILL("moderator", 0., 0., moderator_source, "Source") d22.addComment("Sample position") d22.addComponentILL("sample_position", 0., 0., 0., "SamplePos") d22.addComment("MONITORS") d22.addMonitors(names=["monitor1", "monitor2"], distance=[zMon1, zMon2]) d22.addComment("MONITOR SHAPE") d22.addComment("FIXME: Do something real here.") d22.addDummyMonitor(0.01, 0.03) d22.addComment("MONITOR IDs") d22.addMonitorIds([repr(100000), repr(100001)]) d22.addComment("DETECTOR") d22.addComponentRectangularDetector(detector0, 0., 0., zPos, roty=180., idstart=id0, idfillbyfirst=FF, idstepbyrow=SR) d22.addRectangularDetector(detector0, pixelName, xstart, xstep, xpixels, ystart, ystep, ypixels) d22.addComment("PIXEL, EACH PIXEL IS A DETECTOR") d22.addCuboidPixel(pixelName, [-x, -y, thickness/2.], [-x, y, thickness/2.], [-x, -y, -thickness/2.], [x, -y, thickness/2.], shape_id="pixel-shape")
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()
Two detector multi-tube detectors Sample-detector distances range from 1.2 m to 12.8 m Detector 1 (rear): Single panel mono-block size 640 x 640 mm Pixel size 5 x 5 mm^2 ( 128 x 128 pixels ) Detector 2 (front): 4-panel mono-block, size 160 x 640 mm per panel Pixel size 5 x 5 mm^2 ( 32 x 128 pixels ) For more information, please visit https://www.ill.eu/instruments-support/instruments-groups/instruments/d33/characteristics/ """ d33 = MantidGeom(instrumentName, comment=comment, valid_from=validFrom) d33.addSnsDefaults(default_view='3D', axis_view_3d='z-') d33.addComment("SOURCE") d33.addComponentILL("moderator", 0., 0., moderator_source, "Source") d33.addComment("Sample position") d33.addComponentILL("sample_position", 0., 0., 0., "SamplePos") d33.addComment("MONITORS") d33.addMonitors(names=["monitor1", "monitor2"], distance=[zMon1, zMon2]) d33.addComment("MONITOR SHAPE") d33.addComment("FIXME: Do something real here.") d33.addDummyMonitor(0.01, 0.03) d33.addComment("MONITOR IDs") d33.addMonitorIds([repr(500000), repr(500001)]) d33.addComment("DETECTORS") d33.addComponentILL("detector", 0., 0., 0.) detector = d33.makeTypeElement("detector") d33.addComponentRectangularDetector(detector0, 0.,
pixel_per_tube = 256 tube_width = 0.685 tube_radius = 0.0127 number_of_tubes = 8 tube_angles = [12, 31, 50, 69, 88, 107, 126, 145] vertical_offset = 0.015 distance_to_sample = 1.855 chopper_to_sample = -34.3 monitor_to_sample = -0.178 in16b = MantidGeom(instrument_name, comment=comment, valid_from=valid_from) in16b.addSnsDefaults(default_view='3D', axis_view_3d='z-', theta_sign_axis="x") in16b.addComment("Sample position") in16b.addSamplePosition() in16b.addComment("Chopper position") in16b.addModerator(distance=chopper_to_sample, name="chopper") in16b.addComment("MONITOR") in16b.addMonitors(names=["monitor"], distance=[monitor_to_sample]) in16b.addDummyMonitor(0.001, 0.001) in16b.addMonitorIds([0]) in16b.addComment("Detector") in16b.addComponentILL("detector", 0, 0, 0) detector = in16b.makeTypeElement("detector") # create tubes id lists
geom_input_file = "SNS/SEQ/SEQ_geom_19890-.txt" # Set header information comment = "Created by Michael Reuter" # Time needs to be in UTC? valid_from = "2012-04-04 14:15:46" # Get geometry information file 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(-20.0114) det.addSamplePosition() det.addComment("CHOPPERS") det.addChopper("t0-chopper",-10.51) det.addVerticalAxisT0Chopper("t0-chopper") det.addChopper("fermi-chopper",-2.00180) det.addFermiChopper("fermi-chopper") det.addComment("MONITORS") det.addMonitors(names=["monitor1", "monitor2"], distance=["-1.77808", "8.99184"]) row_id = "" row_id_list = [] doc_handle = None for i in range(num_dets):
Dead-time 34 ns It consists of 64 horizontal tubes, each has a height of 7.4 mm It consists of 256 pixels, each about 1.2 mm wide Beam area at sample position 40 mm x 10 mm (width x height) Scattering plane is vertical Q-range, up 0.0045 - 0.42 A-1 Q-range, down 0.0045 - 0.27 A-1 For more information, please visit https://www.ill.eu/instruments-support/instruments-groups/instruments/figaro/characteristics/ """ figaro = MantidGeom(instrumentName, comment=comment, valid_from=validFrom) figaro.addSnsDefaults(theta_sign_axis='y') figaro.addComment("SOURCE") figaro.addComponentILL("chopper1", 0.0, 0.0, zSource, "Source") figaro.addComment("Sample position") figaro.addComponentILL("sample_position", 0.0, 0.0, 0.0, "SamplePos") figaro.addComment("MONITORS") figaro.addMonitors(names=["monitor1", "monitor2"], distance=[zMon1, zMon2]) figaro.addComment("MONITOR SHAPE") figaro.addComment("FIXME: Do something real here.") figaro.addDummyMonitor(0.01, 0.03) figaro.addComment("MONITOR IDs") figaro.addMonitorIds(["100000", "100001"]) figaro.addComment("2 Slits") figaro.addComponentILL("slit2", 0.0, 0.0, slit2Centre) figaro.makeTypeElement("slit2") figaro.addComponentILL("slit3", 0.0, 0.0, slit3Centre) figaro.makeTypeElement("slit3")
# funny ordering copied from TS return Rectangle(three, four, one, two, tolerance_len=tolerance_len) if __name__ == "__main__": inst_name = "PG3" xml_outfile = inst_name+"_Definition.xml" authors = ["Stuart Campbell", "Vickie Lynch", "Peter Peterson", "Janik Zikovsky"] # boiler plate stuff instr = MantidGeom(inst_name, comment="Created by " + ", ".join(authors), valid_from="2013-08-01 00:00:01") instr.addComment("DEFAULTS") instr.addSnsDefaults() instr.addComment("SOURCE") instr.addModerator(L1) instr.addComment("SAMPLE") instr.addSamplePosition() # monitors instr.addComment("MONITORS") instr.addMonitors([-1.], ["monitor1"]) #instr.addMonitors([L1+59., L1+62.5, L1+64], ["monitor1", "monitor2", "monitor3"]) # choppers - copied verbatium from TS-geometry """ chopper1 = Component("chopper1", "NXchopper") chopper1.setComment("CHOPPERS")
geom_input_file = "SNS/CNCS/CNCS_geom_2017B.txt" # Set header information comment = "Created by Andrei Savici" # Time needs to be in UTC? valid_from = "2017-08-07 10:00:00" # Get geometry information file 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])
</parameter> </component-link> </parameter-file> ''' if __name__ == '__main__': valid_from = '2021-02-01 00:00:00' filename = 'MANDI_Definition_{}.xml'.format(valid_from.split()[0]) # read in the detector calibration detcal = DetCal('SNS/MANDI/MaNDi-February2021.DetCal') # write the instrument geometry instr = MantidGeom('MANDI', valid_from=valid_from) instr.addComment('DEFAULTS') instr.addSnsDefaults(default_view='spherical_y') instr.addComment("SOURCE") instr.addModerator(detcal.l1) instr.addComment("SAMPLE") instr.addSamplePosition() instr.addComment("MONITORS") instr.addMonitors(distance=[-2.935, -0.898, 1.042], names=["monitor1", 'monitor2', 'monitor3']) # add banks here for bank in detcal.banks: bank.addToXml(instr)
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()
geom_input_file = "SNS/CNCS/CNCS_geom_2016B.txt" # Set header information comment = "Created by Michael Reuter" # Time needs to be in UTC? valid_from = "2016-07-14 00:00:00" # Get geometry information file 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])
Multi-detector: Size 1024 mm x 1024 mm Nominal resolution: 128 x 256 Pixel size 8 x 4 mm2 Low resolution: 128 x 128 Pixel size 8 x 8 mm2 For more information, please visit https://www.ill.eu/instruments-support/instruments-groups/instruments/d22/characteristics/ """ d22 = MantidGeom(instrumentName, comment=comment, valid_from=validFrom) d22.addSnsDefaults() d22.addComment("SOURCE") d22.addComponentILL("moderator", 0., 0., moderator_source, "Source") d22.addComment("Sample position") d22.addComponentILL("sample_position", 0., 0., 0., "SamplePos") d22.addComment("MONITORS") d22.addMonitors(names=["monitor1", "monitor2"], distance=[zMon1, zMon2]) d22.addComment("MONITOR SHAPE") d22.addComment("FIXME: Do something real here.") d22.addDummyMonitor(0.01, 0.03) d22.addComment("MONITOR IDs") d22.addMonitorIds([repr(100000), repr(100001)]) d22.addComment("DETECTOR") d22.addComponentRectangularDetector(detector0, 0., 0., zPos, idstart=id0, idfillbyfirst=FF, idstepbyrow=SR) d22.addRectangularDetector(detector0, pixelName, xstart, xstep, xpixels, ystart, ystep, ypixels) d22.addComment("PIXEL, EACH PIXEL IS A DETECTOR") d22.addCuboidPixel(pixelName, [-x, -y, z], [x, y, z], [-x, -y, thickness], [x, -y, z], shape_id="pixel-shape")
- wavelength 4.8 A, qmin = 0.3, qmax = 2.5 - wavelength 5.7 A, qmin = 0.2, qmax = 2.1 - Spectroscopy time-of-flight - using Fermi chopper, with the same possible wavelengths Source-to-sample distance is 0.48 m Three detector banks with 44 position-insensitive He3 detectors each Each detector located 1.5 m from the sample covering 2 Theta range from about 10 to 155 degrees Detector tubes have 25 mm in diameter and are 250 mm in height For more information, please visit https://www.ill.eu/instruments-support/instruments-groups/instruments/d7/characteristics/ """ d7 = MantidGeom(instrumentName, comment=comment, valid_from=validFrom) d7.addSnsDefaults(default_view='3D', axis_view_3d='z-', theta_sign_axis="x") d7.addComment("SOURCE") d7.addComponentILL('SOURCE', 0.0, 0.0, source, 'Source') d7.addComment("Sample position") d7.addComponentILL("sample_position", 0., 0., 0., "SamplePos") d7.addComment("MONITORS") 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