}) det.addComment("DET PACK") det.addWANDDetector("panel", NUM_TUBES_PER_BANK, TUBE_WIDTH, AIR_GAP_WIDTH, RADIUS, type_name="wire") det.addComment("20CM WIRE 512 PIXELS") det.addPixelatedTube("wire", NUM_PIXELS_PER_TUBE, TUBE_SIZE) det.addComment("PIXEL FOR WIRE") det.addCylinderPixel("pixel", (0.0, 0.0, 0.0), (0.0, 1.0, 0.0), (TUBE_WIDTH / 2.0), (TUBE_SIZE / NUM_PIXELS_PER_TUBE)) det.addComment("DETECTOR IDs") offset = 0 for i in range(NUM_DETS): id_list = [] id_list.append(i * PIXELS_PER_BANK) id_list.append((i + 1) * PIXELS_PER_BANK - 1) id_list.append(None) det.addDetectorIds('bank' + str(NUM_DETS - i), id_list) det.addComment("MONITOR IDs") det.addMonitorIds(["-1"]) det.writeGeom(xml_outfile)
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)
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)
# update engineering postions with values from survey - survey values are worse positionsSurvey = readSurveyPositions( 'SNS/NOMAD/NOMAD_survey_20210121.csv') 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) # 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)
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") psdc = geometry.addComponent("single_pixel", root=psds, blank_location=False) for i in range(len(PSD_azimuths)): t = PSD_azimuths[i]*pi/180. x = - psd * sin(t) z = - psd * cos(t) for p in range(pixels): y = -height/2 + p * height/pixels nx, ny, nz = mirror(x, y, z) if args.geometrytype == 'N': geometry.addLocation(root=psdc, x=nx, y=ny, z=nz, name="tube_{0}_pixel_{1}".format(i+1, p+1)) else: geometry.addLocation(root=psdc, x=x, y=y, z=z, nx=nx, ny=ny, nz=nz, name="tube_{0}_pixel_{1}".format(i+1, p+1), neutronic=True) geometry.addCylinderPixel("single_pixel", [0.0005, 90., -90.], [0.,1.,0.], 0.0027, 0.001) geometry.addDetectorIds("single_detectors", [PSDs*pixels+1,PSDs*pixels+SDs, None]) geometry.addDetectorIds("psds", [1,PSDs*pixels,None]) geometry.writeGeom("./ILL/IDF/" + instrument_name + "_Definition.xml")
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) det.addComment("PIXEL FOR STANDARD 2m 128 PIXEL TUBE") det.addCylinderPixel("pixel", (0.0, 0.0, 0.0), (0.0, 1.0, 0.0), (TUBE_WIDTH/2.0), (TUBE_SIZE/NUM_PIXELS_PER_TUBE)) det.addComment("MONITOR SHAPE") det.addComment("FIXME: Do something real here.") det.addDummyMonitor(0.01, 0.03) det.addComment("DETECTOR IDs") det.addDetectorIds(label, [0, (num_dets * PIXELS_PER_BANK) - 1 , None]) det.addComment("MONITOR IDs") det.addMonitorIds(["-1", "-2", "-3"]) det.addComment("DETECTOR PARAMETERS") det.addDetectorParameters(label, TUBE_PRESSURE, TUBE_THICKNESS, TUBE_TEMPERATURE) #det.showGeom() det.writeGeom(xml_outfile)
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 z1_first=3.86/8.45*3.2 x1_first=1.44/8.45*3.2 dx_first=x1_first-x0_first
det.addComment("FIXME: Do something real here.") det.addDummyMonitor(0.01, 0.03) det.addComment("DETECTOR IDs") # FIXME: Set to zero when A and E rows are filled offset = 37888 for i in range(len(row_id_list)): row_id_str = row_id_list[i] + " row" det_names = [x for x in detinfo["Location"] if x.startswith(row_id_list[i])] id_list = [] for j in range(len(det_names)): id_list.append(j * PIXELS_PER_BANK + offset) id_list.append((j+1) * PIXELS_PER_BANK - 1 + offset) id_list.append(None) offset += (PIXELS_PER_BANK * (j + 1)) det.addDetectorIds(row_id_str, id_list) det.addComment("MONITOR IDs") det.addMonitorIds(["-1", "-2"]) det.addComment("DETECTOR PARAMETERS") for row_id in row_id_list: row_id_str = row_id + " row" det.addDetectorParameters(row_id_str, TUBE_PRESSURE, TUBE_THICKNESS, TUBE_TEMPERATURE) #det.showGeom() det.writeGeom(xml_outfile)
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)
det.addComment("DET PACK") det.addWANDDetector("panel", NUM_TUBES_PER_BANK, TUBE_WIDTH, AIR_GAP_WIDTH, RADIUS, type_name="wire") det.addComment("20CM WIRE 512 PIXELS") det.addPixelatedTube("wire", NUM_PIXELS_PER_TUBE, TUBE_SIZE) det.addComment("PIXEL FOR WIRE") det.addCylinderPixel("pixel", (0.0, 0.0, 0.0), (0.0, 1.0, 0.0), (TUBE_WIDTH/2.0), (TUBE_SIZE/NUM_PIXELS_PER_TUBE)) det.addComment("DETECTOR IDs") offset = 0 for i in range(NUM_DETS): id_list = [] id_list.append(i * PIXELS_PER_BANK) id_list.append((i+1) * PIXELS_PER_BANK - 1) id_list.append(None) det.addDetectorIds('bank'+str(NUM_DETS-i), id_list) det.addComment("MONITOR IDs") det.addMonitorIds(["-1"]) 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")
geometry.addCylinderPixelAdvanced( 'standard_pixel', center_bottom_base=pixelBase, axis={'x': 0., 'y': 1., 'z': 0.}, pixel_radius=pixelRadius, pixel_height=tubePixelStep, algebra='pixel_shape') root = geometry.getRoot() bank = le.SubElement(root, 'type', name='bank_uniq') tubes = le.SubElement(bank, 'component', type='standard_tube') for index, angle in enumerate(azimuthalAngle): attributes = { 'r': str(radius), 't': str(angle), 'rot': str(angle), 'axis-x': str(0.), 'axis-y': str(1.), 'axis-z': str(0.), 'name': 'tube_{}'.format(index+1) } le.SubElement(tubes, 'location', **attributes) tubeType = le.SubElement(root, 'type', name='standard_tube', outline='yes') tube = le.SubElement(tubeType, 'component', type='standard_pixel') pixelPositions = np.linspace(-totalTubeHeight/2., totalTubeHeight/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_uniq') le.SubElement(bankComponent, 'location') geometry.addDetectorIds('detectors', [1, 98304, None]) geometry.writeGeom("./ILL/IDF/" + instrumentName + "_Definition.xml")
and args.firsttubedefocus == 'Y') if args.geometrytype == 'N': geometry.addLocation(root=psdc, x=nx, y=ny, z=nz, name="tube_{0}_pixel_{1}".format( i + 1, p + 1)) else: geometry.addLocation(root=psdc, x=x, y=y, z=z, nx=nx, ny=ny, nz=nz, name="tube_{0}_pixel_{1}".format( i + 1, p + 1), neutronic=True) pixel_factor = 1. if args.geometrytype == 'N': # make pixels bigger so they are visible in instrument view pixel_factor = 10. geometry.addCylinderPixel("single_pixel", [0.0005, 90., -90.], [0., 1., 0.], 0.0027 * pixel_factor, 0.001 * pixel_factor) geometry.addDetectorIds("single_detectors", [PSDs * pixels + 1, PSDs * pixels + SDs, None]) geometry.addDetectorIds("psds", [1, PSDs * pixels, None]) iname = 'F' if args.firsttubedefocus == 'Y' else '' geometry.writeGeom("./ILL/IDF/" + instrument_name + iname + "_Definition.xml")
det.addComment("DETECTOR IDs") # FIXME: Set to zero when A and E rows are filled offset = 37888 for i in range(len(row_id_list)): row_id_str = row_id_list[i] + " row" det_names = [ x for x in detinfo["Location"] if x.startswith(row_id_list[i]) ] id_list = [] for j in range(len(det_names)): id_list.append(j * PIXELS_PER_BANK + offset) id_list.append((j + 1) * PIXELS_PER_BANK - 1 + offset) id_list.append(None) offset += (PIXELS_PER_BANK * (j + 1)) det.addDetectorIds(row_id_str, id_list) det.addComment("MONITOR IDs") det.addMonitorIds(["-1", "-2"]) det.addComment("DETECTOR PARAMETERS") for row_id in row_id_list: row_id_str = row_id + " row" det.addDetectorParameters(row_id_str, TUBE_PRESSURE, TUBE_THICKNESS, TUBE_TEMPERATURE) #det.showGeom() det.writeGeom(xml_outfile)
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()
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)) ''' # Creating inelastic pixel # Pixel Height y_pixel_offset = nfile["/entry/instrument/bank1/y_pixel_offset"].value pixel_ysize = y_pixel_offset[1] - y_pixel_offset[0] # Pixel Width x_pixel_offset = nfile["/entry/instrument/bank1/x_pixel_offset"].value
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 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
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 z1_first=3.86/8.45*3.2 x1_first=1.44/8.45*3.2 dx_first=x1_first-x0_first
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")
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()
positions = readEngineeringPositions('SNS/NOMAD/NOM_detpos.txt') # update engineering postions with values from survey - survey values are worse #positionsSurvey = readSurveyPositions('SNS/NOMAD/NOMAD_survey_20180530_group6.csv') #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)
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 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,