# -- MONITOR --
    vulcan_geom.addComment("MONITORS")
    vulcan_geom.addMonitors(distance=[4.83, 1.50],
                            names=["monitor2", "monitor3"])

    # -- ADD BANKS --
    # NOTE:
    # To compensate for the curved (1,2,3,4,6) and flat (5) banks, the actual
    # physical positions is stored at the eight-pack level.
    # The bank here is set to (0,0,0) with zero rotations.
    logging.info(f"Add Banks")
    bank_ids = df["bank"].unique()
    lb_pos = ["X", "Y", "Z"]

    for bank_id in bank_ids:
        elem_bank = vulcan_geom.addComponent(type_name=f"bank{bank_id}",
                                             idlist=f"bank{bank_id}")
        vulcan_geom.addLocation(elem_bank, x=0, y=0, z=0, rot_y=0)

    # -- ADD 8PACKS --
    # NOTE:
    # Assume that the given csv files contains measurements for all eight-packs in each bank
    logging.info(f"Add 8-packs")
    for bank_id in bank_ids:
        # select bank
        bk = df[df["bank"] == bank_id]
        # make top element
        elem_bank = vulcan_geom.makeTypeElement(f"bank{bank_id}")
        # add individual eight packs based on measurements
        eightpack_ids = bk["eightpack"].unique()
        type_name = "eightpackshort" if bank_id == 5 else "eightpack"
        for eightpack_id in eightpack_ids:
    row_id = ""
    row_id_list = []
    doc_handle = None
    for i in range(num_dets):
        location = detinfo["Location"][i]
        # REMOVE ME: when A and E rows are filled
        if location.startswith("A") or \
               location.startswith("E"):
            continue
        
        if row_id != location[0]:
            row_id = location[0]
            row_id_list.append(row_id)
            row_id_str = row_id + " row"
            det.addComponent(row_id_str, row_id_str)
            doc_handle = det.makeTypeElement(row_id_str)

        det.addComponent(location, root=doc_handle)
        
        xpos = convert(detinfo["X"][i])
        ypos = convert(detinfo["Y"][i])
        zpos = convert(detinfo["Z"][i])
        roty = float(detinfo["Angle"][i]) + FLIPY
        det_type = "eightpack"
        
        if location.startswith("C"):
            if location.endswith("T"):
                det_type = "eightpack-top"
            elif location.endswith("B"):
                det_type = "eightpack-bottom"
def mirror(x, y, z):
    r, t, p = topolar(x, y, z)
    r += 2*analyser
    t = pi - t
    p += pi
    return tocartesian(r, t, p)

geometry = MantidGeom(instrument_name, comment=comment, valid_from=valid_from)
geometry.addSnsDefaults(indirect=args.geometrytype != 'N')
geometry.addSamplePosition()
geometry.addModerator(distance=ch12, name="chopper")
geometry.addMonitors(names=["monitor"], distance=[mon], neutronic=args.geometrytype != 'N')
geometry.addDummyMonitor(0.001, 0.001)
geometry.addMonitorIds([0])
geometry.addComponent("single_detectors", "single_detectors")
sds = geometry.makeTypeElement("single_detectors")
sdc = geometry.addComponent("single_pixel", root=sds, blank_location=False)
r = 2*analyser+psd
for i in range(len(SD_azimuths)):
    t=SD_azimuths[i]* pi/180.
    x = - psd * sin(t)
    y = 0.
    z = - psd * cos(t)
    nx, ny, nz = mirror(x, y, z)
    if args.geometrytype == 'N':
        geometry.addLocation(root=sdc, x=nx, y=ny, z=nz, name="single_tube_{0}".format(i+1))
    else:
        geometry.addLocation(root=sdc, x=x, y=y, z=z, nx=nx, ny=ny, nz=nz, name="single_tube_{0}".format(i+1), neutronic=True)
geometry.addComponent("psds", "psds")
psds = geometry.makeTypeElement("psds")
Beispiel #4
0
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)
    row_id = ""
    row_id_list = []
    doc_handle = None
    for i in range(num_dets):
        location = detinfo["Location"][i]
        # REMOVE ME: when A and E rows are filled
        if location.startswith("A") or \
               location.startswith("E"):
            continue

        if row_id != location[0]:
            row_id = location[0]
            row_id_list.append(row_id)
            row_id_str = row_id + " row"
            det.addComponent(row_id_str, row_id_str)
            doc_handle = det.makeTypeElement(row_id_str)

        det.addComponent(location, root=doc_handle)

        xpos = convert(detinfo["X"][i])
        ypos = convert(detinfo["Y"][i])
        zpos = convert(detinfo["Z"][i])
        roty = float(detinfo["Angle"][i]) + FLIPY
        det_type = "eightpack"

        if location.startswith("C"):
            if location.endswith("T"):
                det_type = "eightpack-top"
            elif location.endswith("B"):
                det_type = "eightpack-bottom"
    inst_name = "CNCS"
    detinfo = readFile(geom_input_file)
    num_dets = len(detinfo.values()[0])
    xml_outfile = inst_name+"_Definition.xml"
 
    det = MantidGeom(inst_name, comment=comment, valid_from=valid_from)
    det.addSnsDefaults()
    det.addComment("SOURCE AND SAMPLE POSITION")
    det.addModerator(-36.262)
    det.addSamplePosition()
    det.addComment("MONITORS")
    det.addMonitors(names=["monitor1", "monitor2", "monitor3"],
                    distance=["-29.949", "-28.706", "-1.416"])

    label = "detectors"
    det.addComponent(label, label)
    doc_handle = det.makeTypeElement(label)
    for i in range(num_dets):
        detname = BANKFMT % (i+1)
        roty = float(detinfo["BankAngle"][i]) + FLIPY
        xpos = convert(detinfo["Bank_xpos"][i])
        ypos = convert(detinfo["Bank_ypos"][i])
        zpos = convert(detinfo["Bank_zpos"][i])
        det.addComponent(detname, root=doc_handle)
        det.addDetector(xpos, ypos, zpos, ROTX, roty, ROTZ, detname, "eightpack")

    det.addComment("STANDARD 8-PACK")
    det.addNPack("eightpack", NUM_TUBES_PER_BANK, TUBE_WIDTH, AIR_GAP_WIDTH)

    det.addComment("STANDARD 2m 128 PIXEL TUBE")
    det.addPixelatedTube("tube", NUM_PIXELS_PER_TUBE, TUBE_SIZE)
        positions[key] = positionsSurvey[key]

    num_banks = [14, 23, 14, 12, 18, 18]

    ####################
    # add the id lists for groups - [start, stop, step]
    start, stop = -1, -1
    for i, num_banks_in_pack in enumerate(num_banks):
        start = stop + 1
        stop = start + num_banks_in_pack * 8 * 128 - 1
        info = instr.addDetectorIds('Group%d' % (i + 1), [start, stop, None])

    for i, _ in enumerate(num_banks):
        group = 'Group%d' % (i + 1)
        # set blank_location=False to add <location/> tag to component
        group = instr.addComponent(group, idlist=group, blank_location=False)

    ####################
    # group 1 is banks 1-14 (inclusive)
    bank_offset = 0
    group = instr.makeTypeElement('Group1')
    for i in range(num_banks[0]):
        bank_num = bank_offset + i + 1
        bank = "bank%d" % bank_num
        corners = getCorners(bank_num)
        rect = getRectangle(bank_num, positions, corners)
        det = instr.makeDetectorElement('pack', root=group)
        rect.makeLocation(instr, det, bank)

    # group 2 is banks 15-37 (inclusive)
    bank_offset += num_banks[0]
Beispiel #8
0
if __name__=="__main__":
  filename='SNS/HYSPEC/hyspec_MotorList4GG.xls'
  info=read_xls(filename)
  inst_name="HYSPEC"
  xml_outfile=inst_name+"_Definition.xml"
  det=MantidGeom(inst_name)
  det.addSnsDefaults()
  det.addComment("SOURCE AND SAMPLE POSITION")
  det.addModerator("msd -0.001*msd-38.980")# TODO: change moderator position to read from the excel sheet
  det.addSamplePosition()
  det.addComment("MONITORS")
  det.addMonitors(names=["monitor1", "monitor2", "monitor3"],distance=["msd -0.001*msd-3.340", "msd -0.001*msd-1.59643", "-0.200"])
  # TODO: change monitor positions to read from the excel sheet

  label = "Tank"
  tank=det.addComponent(label, label,blank_location=False)
  det.addLocationRTP(tank,"0","s2 0.0+s2","0","0","s2 0.0+s2","0")
  doc_handle = det.makeTypeElement(label)
  num_dets=len(info["name"])
  for i in range(num_dets):
    det.addComponent(info["name"][i], root=doc_handle)
    det.addDetector(info["X"][i], info["Y"][i], info["Z"][i], 
                    info["RotX"][i], info["RotY"][i], info["RotZ"][i],
                    info["name"][i], "eightpack")

  det.addComment("STANDARD 8-PACK")
  det.addNPack("eightpack", info["NUM_TUBES_PER_BANK"], info["TUBE_WIDTH"], info["AIR_GAP_WIDTH"])

  det.addComment("STANDARD 1.2m 128 PIXEL TUBE")
  det.addPixelatedTube("tube", info["NUM_PIXELS_PER_TUBE"], info["TUBE_SIZE"])
	
    banks = readPositionsRight("SNS/POWGEN/PG3_geom_2017.csv")
    banksL = readPositionsLeft("SNS/POWGEN/PG3_geom_left_2018.csv")
    for bank in banksL.keys():
        banks[bank] = banksL[bank]
    del banksL

    # delete the banks that are no longer installed
    for bank in [1,5,6,10,32,35,38,28,31,34,37,40]:
        del banks[bank]

    # create north and south sides
    sides = {'North':['Column%d' % i for i in range(13,25)],
             'South':['Column%d' % i for i in range(1,13)]}
    # add the empty components
    for name in sides.keys():
        group = instr.addComponent(name)
    # add the columns to the groups
    for side in sides.keys():
        group = instr.makeTypeElement(side)

        for column in sides[side]:
            instr.addComponent(column, root=group)

    # create an ordered list of all columns
    columns = set()
    for name in banks.keys():
        column, _ =  banks[name]
        columns.add(column)
    columns = list(columns)
    columns.sort()
Beispiel #10
0
    det.addDetectorStringParameters("correlation-chopper",("sequence",choppersequence))

    row_id = ""
    row_id_list = []
    doc_handle = None
    for i in range(num_dets):
        location = detinfo["Location"][i]

        if location[0] == "#":
            continue

        if row_id != location[0]:
            row_id = location[0]
            row_id_list.append(row_id)
            row_id_str = row_id + " row"
            det.addComponent(row_id_str, row_id_str)
            doc_handle = det.makeTypeElement(row_id_str)

        det.addComponent("bank"+str(i+1), root=doc_handle)
        
        xpos = convert(detinfo["Xsci"][i])
        ypos = convert(detinfo["Ysci"][i])
        zpos = convert(detinfo["Zsci"][i])
        det_type = "sixteenpack"
        
        det.addDetector(xpos, ypos, zpos, 
                        detinfo["Xrot_sci"][i], detinfo["Yrot_sci"][i], detinfo["Zrot_sci"][i],
                        "bank"+str(i+1), det_type)

    det.addComment("16-PACK")
    det.addNPack("sixteenpack", NUM_TUBES_PER_BANK, TUBE_WIDTH, AIR_GAP_WIDTH)
Beispiel #11
0
    for i in range(banks):
        pixel_id = file["/entry/instrument/bank%d/pixel_id" % (i + 1)].value
        distance = file["/entry/instrument/bank%d/distance" % (i + 1)].value
        polar_angle = file["/entry/instrument/bank%d/polar_angle" %
                           (i + 1)].value
        polar_angle *= (180.0 / math.pi)
        azimuthal_angle = file["/entry/instrument/bank%d/azimuthal_angle" %
                               (i + 1)].value
        azimuthal_angle *= (180.0 / math.pi)

        analyser_wavelength = file["/entry/instrument/analyzer%d/wavelength" %
                                   (i + 1)].value
        analyser_energy = 81.8042051 / analyser_wavelength**2

        bank_id = "bank%d" % (i + 1)
        det.addComponent(bank_id, bank_id)
        #doc_handle = det.makeTypeElement(bank_id)

        det.addDetectorPixels(bank_id,
                              r=distance,
                              theta=polar_angle,
                              phi=azimuthal_angle,
                              names=pixel_id,
                              energy=analyser_energy)

        det.addDetectorPixelsIdList(bank_id, r=distance, names=pixel_id)

    # Pixel Height
    y_pixel_offset = file["/entry/instrument/bank1/y_pixel_offset"].value
    pixel_ysize = y_pixel_offset[1] - y_pixel_offset[0]
Beispiel #12
0
    xml_outfile = inst_name + "_Definition.xml"
    det = MantidGeom(inst_name)
    det.addSnsDefaults()
    det.addComment("SOURCE AND SAMPLE POSITION")
    det.addModerator(
        "msd -0.001*msd-38.980"
    )  # TODO: change moderator position to read from the excel sheet
    det.addSamplePosition()
    det.addComment("MONITORS")
    det.addMonitors(
        names=["monitor1", "monitor2", "monitor3"],
        distance=["msd -0.001*msd-3.340", "msd -0.001*msd-1.59643", "-0.200"])
    # TODO: change monitor positions to read from the excel sheet

    label = "Tank"
    tank = det.addComponent(label, label, blank_location=False)
    det.addLocationRTP(tank, "0", "s2 0.0+s2", "0", "0", "s2 0.0+s2", "0")
    doc_handle = det.makeTypeElement(label)
    num_dets = len(info["name"])
    for i in range(num_dets):
        det.addComponent(info["name"][i], root=doc_handle)
        det.addDetector(info["X"][i], info["Y"][i], info["Z"][i],
                        info["RotX"][i], info["RotY"][i], info["RotZ"][i],
                        info["name"][i], "eightpack")

    det.addComment("STANDARD 8-PACK")
    det.addNPack("eightpack", info["NUM_TUBES_PER_BANK"], info["TUBE_WIDTH"],
                 info["AIR_GAP_WIDTH"])

    det.addComment("STANDARD 1.2m 128 PIXEL TUBE")
    det.addPixelatedTube("tube", info["NUM_PIXELS_PER_TUBE"],
Beispiel #13
0
        t = pi - t
        r += 2 * analyser
    return tocartesian(r, t, p)


geometry = MantidGeom(instrument_name, comment=comment, valid_from=valid_from)
geometry.addSnsDefaults(indirect=args.geometrytype != 'N')
geometry.addSamplePosition()
geometry.addModerator(distance=ch12, name="chopper")
geometry.addMonitors(names=["monitor"],
                     distance=[mon],
                     neutronic=args.geometrytype != 'N')
geometry.addDummyMonitor(0.001, 0.001)
geometry.addMonitorIds([0])
geometry.addComponent("single_detectors",
                      "single_detectors",
                      blank_location=False)
sds = geometry.makeTypeElement("single_detectors")
sdc = geometry.addComponent("single_pixel", root=sds)
for i in range(len(SD_azimuths)):
    t = SD_azimuths[i] * pi / 180.
    x = sd * sin(t)
    y = 0.
    z = -sd * cos(t)
    nx, ny, nz = mirror(x, y, z, sd_analyser)
    if args.geometrytype == 'N':
        geometry.addLocation(root=sdc,
                             x=nx,
                             y=ny,
                             z=nz,
                             name="single_tube_{0}".format(i + 1))
def main():
    from helper import MantidGeom
    
    inst_name = "VISION"
    
    xml_outfile = inst_name+"_Definition.xml"
    
    det = MantidGeom(inst_name, comment=" Created by Stuart Campbell ")
    det.addSnsDefaults(indirect=True)
    det.addComment("SOURCE AND SAMPLE POSITION")
    det.addModerator(-16.0)
    det.addSamplePosition()

    # Backscattering Banks are 21-100

    BACKSCATTERING_NTUBES = 80

    det.addComponent("elastic-backscattering", "elastic-backscattering")
    handle = det.makeTypeElement("elastic-backscattering")

    idlist = []

    for k in range(BACKSCATTERING_NTUBES):
        id_start = 26624+(256*k)
        id_end = 26624 + (256*k) + 255
        angle = -(2.25 + 4.5*k)
        bankid = 21 + k
        bank_name = "bank%d" % bankid

        det.addComponent(bank_name, root=handle)

        z_coord = -0.998

        if k%2 == 0:
            # Even tube number (long)
            centre_offset = BS_ELASTIC_LONG_TUBE_INNER_RADIUS + (BS_ELASTIC_LONG_TUBE_LENGTH/2.0)
            #centre_offset = BS_ELASTIC_LONG_TUBE_INNER_RADIUS
            component_name = "tube-long-bs-elastic"
        else:
            # Odd tube number (short)
            centre_offset = BS_ELASTIC_SHORT_TUBE_INNER_RADIUS + (BS_ELASTIC_SHORT_TUBE_LENGTH/2.0)
            component_name = "tube-short-bs-elastic"

        x_coord = centre_offset * math.cos(math.radians(90-angle))
        y_coord = centre_offset * math.sin(math.radians(90-angle))

        det.addDetector(x_coord, y_coord, z_coord, 0, 0, -angle, bank_name, component_name)

        idlist.append(id_start)
        idlist.append(id_end)
        idlist.append(None)

    det.addDetectorIds("elastic-backscattering", idlist)


    # 90 elastic banks

    elastic_banklist = [3,6,9,12,15,18]
    elastic_bank_start = [2048,6144,10240,14336,18432,22528]
    elastic_angle = [22.5,-22.5,-67.5,-112.5,-157.5,157.5]

    sample_elastic_distance = 0.635

    det.addComponent("elastic", "elastic")
    handle = det.makeTypeElement("elastic")

    idlist = []
    elastic_index = 0

    for i in elastic_banklist:
        bank_name = "bank%d" % i
        det.addComponent(bank_name, root=handle)

        z_coord = 0.0
        x_coord = sample_elastic_distance * math.cos(math.radians(elastic_angle[elastic_index]))
        y_coord = sample_elastic_distance * math.sin(math.radians(elastic_angle[elastic_index]))

        det.addDetector(x_coord, y_coord, z_coord, -90.0, 0, 0., bank_name, "eightpack-elastic", facingSample=True)

        idlist.append(elastic_bank_start[elastic_index])
        idlist.append(elastic_bank_start[elastic_index]+2047)
        idlist.append(None)

        elastic_index += 1


    det.addDetectorIds("elastic", idlist)

    # Inelastic
    inelastic_banklist = [1,2,4,5,7,8,10,11,13,14,16,17,19,20]
    inelastic_bank_start=[0,1024,4096,5120,8192,9216,12288,13312,16384,17408,20480,21504,24576,25600]
    inelastic_angle = [45.0,45.0,0.0,0.0,-45.0,-45.0,-90.0,-90.0,-135.0,-135.0,180.0,180.0,135.0,135.0]
    inelastic_angle_for_rotation = [-45.0,-45.0,180.0,180.0,-135.0,-135.0,-90.0,-90.0,-225.0,-225.0,0.0,0.0,45.0,45.0]

    sample_inelastic_distance = 0.5174

    det.addComponent("inelastic", "inelastic")
    handle = det.makeTypeElement("inelastic")

    idlist = []
    inelastic_index = 0

    for i in inelastic_banklist:
        bank_name = "bank%d" % i
        bank_comp = det.addComponent(bank_name, root=handle, blank_location=True)
#        location_element = le.SubElement(bank_comp, "location")
#        le.SubElement(location_element, "rot", **{"val":"90", "axis-x":"0",
#                                              "axis-y":"0", "axis-z":"1"})

        # Neutronic Positions
        z_coord_neutronic = sample_inelastic_distance * math.tan(math.radians(45.0))

        if inelastic_index % 2 == 0:
            # Facing Downstream
            z_coord = 0.01
        else:
            # Facing to Moderator
            z_coord = -0.01
            z_coord_neutronic = -z_coord_neutronic

            # Physical Positions
        x_coord = sample_inelastic_distance * math.cos(math.radians(inelastic_angle[inelastic_index]))
        y_coord = sample_inelastic_distance * math.sin(math.radians(inelastic_angle[inelastic_index]))

        det.addDetector(-x_coord, y_coord, z_coord, 0, 0, inelastic_angle_for_rotation[inelastic_index]-90.0, bank_name,
            "eightpack-inelastic", neutronic=True, nx=-x_coord, ny=y_coord, nz=z_coord_neutronic)

        efixed = ("Efixed", "3.64", "meV")
        det.addDetectorParameters(bank_name, efixed )

        idlist.append(inelastic_bank_start[inelastic_index])
        idlist.append(inelastic_bank_start[inelastic_index]+1023)
        idlist.append(None)

        inelastic_index += 1


    det.addDetectorIds("inelastic", idlist)


    # 8 packs
    
    det.addComment("INELASTIC 8-PACK")
    det.addNPack("eightpack-inelastic", INELASTIC_TUBES_PER_BANK, INELASTIC_TUBE_WIDTH, 
                 INELASTIC_AIR_GAP, "tube-inelastic", neutronic=True)
    
    det.addComment("ELASTIC 8-PACK")
    det.addNPack("eightpack-elastic", ELASTIC_TUBES_PER_BANK, ELASTIC_TUBE_WIDTH, 
                 ELASTIC_AIR_GAP, "tube-elastic", neutronic=True, neutronicIsPhysical=True)
 
    # TUBES
    det.addComment("INELASTIC TUBE")
    det.addPixelatedTube("tube-inelastic", INELASTIC_TUBE_NPIXELS, 
                         INELASTIC_TUBE_LENGTH, "pixel-inelastic-tube", neutronic=True)
    
    det.addComment("BACKSCATTERING LONG TUBE")
    det.addPixelatedTube("tube-long-bs-elastic", BS_ELASTIC_LONG_TUBE_NPIXELS,
        BS_ELASTIC_LONG_TUBE_LENGTH, "pixel-bs-elastic-long-tube",
        neutronic=True, neutronicIsPhysical=True)
    det.addComment("BACKSCATTERING SHORT TUBE")
    det.addPixelatedTube("tube-short-bs-elastic", BS_ELASTIC_SHORT_TUBE_NPIXELS, 
        BS_ELASTIC_SHORT_TUBE_LENGTH, "pixel-bs-elastic-short-tube",
        neutronic=True, neutronicIsPhysical=True)

    det.addComment("ELASTIC TUBE (90 degrees)")
    det.addPixelatedTube("tube-elastic", ELASTIC_TUBE_NPIXELS, 
                         ELASTIC_TUBE_LENGTH, "pixel-elastic-tube", neutronic=True, neutronicIsPhysical=True)

    # PIXELS
    
    det.addComment("PIXEL FOR INELASTIC TUBES")
    det.addCylinderPixel("pixel-inelastic-tube", (0.0, 0.0, 0.0), (0.0, 1.0, 0.0),
                         (INELASTIC_TUBE_WIDTH/2.0), 
                         (INELASTIC_TUBE_LENGTH/INELASTIC_TUBE_NPIXELS))
    
    det.addComment("PIXEL FOR BACKSCATTERING ELASTIC TUBES (LONG)")
    det.addCylinderPixel("pixel-bs-elastic-long-tube", (0.0, 0.0, 0.0), (0.0, 1.0, 0.0), 
                         (BS_ELASTIC_LONG_TUBE_WIDTH/2.0), 
                         (BS_ELASTIC_LONG_TUBE_LENGTH/BS_ELASTIC_LONG_TUBE_NPIXELS))

    det.addComment("PIXEL FOR BACKSCATTERING ELASTIC TUBES (SHORT)")
    det.addCylinderPixel("pixel-bs-elastic-short-tube", (0.0, 0.0, 0.0), (0.0, 1.0, 0.0),
                         (BS_ELASTIC_SHORT_TUBE_WIDTH/2.0), 
                         (BS_ELASTIC_SHORT_TUBE_LENGTH/BS_ELASTIC_SHORT_TUBE_NPIXELS))
    
    det.addComment("PIXEL FOR ELASTIC TUBES (90 degrees)")
    det.addCylinderPixel("pixel-elastic-tube", (0.0, 0.0, 0.0), (0.0, 1.0, 0.0),
                         (ELASTIC_TUBE_WIDTH/2.0), 
                         (ELASTIC_TUBE_LENGTH/ELASTIC_TUBE_NPIXELS))


    det.addComment(" ##### MONITORS ##### ")
    det.addMonitors(names=["monitor1"], distance=["-6.71625"], neutronic=True)

    # MONITORS

    det.addComment("MONITOR SHAPE")
    det.addComment("FIXME: Do something real here.")
    det.addDummyMonitor(0.01, 0.03)

    det.addComment("MONITOR IDs")
    det.addMonitorIds(["-1"])


    det.showGeom()
    det.writeGeom(xml_outfile)
Beispiel #15
0
    inst_name = "CNCS"
    detinfo = readFile(geom_input_file)
    num_dets = len(detinfo.values()[0])
    xml_outfile = inst_name+"_Definition.xml"
 
    det = MantidGeom(inst_name, comment=comment, valid_from=valid_from)
    det.addSnsDefaults()
    det.addComment("SOURCE AND SAMPLE POSITION")
    det.addModerator(-36.262)
    det.addSamplePosition()
    det.addComment("MONITORS")
    det.addMonitors(names=["monitor1", "monitor2", "monitor3"],
                    distance=["-29.949", "-28.706", "-1.416"])

    label = "detectors"
    det.addComponent(label, label)
    doc_handle = det.makeTypeElement(label)
    for i in range(num_dets):
        detname = BANKFMT % (i+1)
        roty = float(detinfo["BankAngle"][i]) + FLIPY
        xpos = convert(detinfo["Bank_xpos"][i])
        ypos = convert(detinfo["Bank_ypos"][i])
        zpos = convert(detinfo["Bank_zpos"][i])
        det.addComponent(detname, root=doc_handle)
        det.addDetector(xpos, ypos, zpos, ROTX, roty, ROTZ, detname, "eightpack")

    det.addComment("STANDARD 8-PACK")
    det.addNPack("eightpack", NUM_TUBES_PER_BANK, TUBE_WIDTH, AIR_GAP_WIDTH)

    det.addComment("STANDARD 2m 128 PIXEL TUBE")
    det.addPixelatedTube("tube", NUM_PIXELS_PER_TUBE, TUBE_SIZE)
                                  },
                                  pixel_radius=pixelRadius,
                                  pixel_height=pixelHeight,
                                  algebra='pixel_shape')
root = geometry.getRoot()
detectorType = le.SubElement(root, 'type', name='detector')
tubes = le.SubElement(detectorType, 'component', type='tube')
for tubeIndex, tubeAngle in enumerate(tubeAngles):
    x = l2 * np.sin(-np.deg2rad(tubeAngle))
    z = l2 * np.cos(np.deg2rad(tubeAngle))
    attributes = {
        'x': str(x),
        'y': str(0.),
        'z': str(z),
        'name': 'tube_{}'.format(tubeIndex + 1)
    }
    le.SubElement(tubes, 'location', **attributes)
tubeType = le.SubElement(root, 'type', name='tube', outline='yes')
tube = le.SubElement(tubeType, 'component', type='pixel')
tube_bottom_pos = -(equator - 1) * pixelHeight
tube_top_pos = (numberOfPixelsPerTube - equator) * pixelHeight
pixelPositions = np.linspace(tube_bottom_pos, tube_top_pos,
                             numberOfPixelsPerTube)
for i, pos in enumerate(pixelPositions):
    le.SubElement(tube, 'location', y=str(pos), name='pixel_{}'.format(i + 1))
detector = geometry.addComponent('detector', idlist='detectors')
le.SubElement(detector, 'location')
geometry.addDetectorIds('detectors',
                        [1, numberOfTubes * numberOfPixelsPerTube, None])
geometry.writeGeom("./ILL/IDF/" + instrumentName + "_Definition.xml")
    # on the same sides of the arrays for all banks.
    remove_ghosts = slice(-8)    
    
    for i in range(banks):
        pixel_id = nfile["/entry/instrument/bank%d/pixel_id" % (i+1)].value[remove_ghosts]
        distance = nfile["/entry/instrument/bank%d/distance" % (i+1)].value[remove_ghosts]
        polar_angle = nfile["/entry/instrument/bank%d/polar_angle" % (i+1)].value[remove_ghosts]
        polar_angle *= (180.0/math.pi)
        azimuthal_angle = nfile["/entry/instrument/bank%d/azimuthal_angle" % (i+1)].value[remove_ghosts]
        azimuthal_angle *= (180.0/math.pi)
        
        analyser_wavelength = nfile["/entry/instrument/analyzer%d/wavelength" % (i+1)].value[remove_ghosts]
        analyser_energy = 81.8042051/analyser_wavelength**2

        bank_id = "bank%d" % (i+1)
        det.addComponent(bank_id, bank_id)
        #doc_handle = det.makeTypeElement(bank_id)

        det.addDetectorPixels(bank_id, r=distance, theta=polar_angle,
                              phi=azimuthal_angle, names=pixel_id, 
                              energy=analyser_energy)

        det.addDetectorPixelsIdList(bank_id, r=distance, names=pixel_id)

    # Create the diffraction bank information
    det.addComponent("elastic", "elastic")
    handle = det.makeTypeElement("elastic")

    idlist = []

    detector_z = [-2.1474825,-1.704594,-1.108373,-0.4135165,0.3181,1.0218315,1.6330115,2.0993535,2.376999]
Beispiel #18
0
    """

    # guides - not even copying the text

    # mapping of groups to column names
    cols = {
        4: ['B'],
        3: ['C', 'D'],
        2: ['E', 'F'],
        1: ['G', 'H', 'I', 'J', 'K', 'L']
    }

    # add the empty components
    for i in cols.keys():
        name = "Group%d" % i
        group = instr.addComponent(name)  #, idlist=name)

    # add the columns to the group
    for groupNum in cols.keys():
        name = "Group%d" % groupNum
        group = instr.makeTypeElement(name)

        for column in cols[groupNum]:
            name = "Column%d" % ("ABCDEFGHIJKL".index(column) + 1)
            instr.addComponent(name, root=group)

    # the actual work of adding the detectors
    corners = CornersFile("PG3_geom_2013_txt.csv", abs(L1))
    addGroup(corners, cols[4], ["B2", "B3", "B4", "B5", "B6"])
    addGroup(corners, cols[3],
             ['C2', 'C3', 'C4', 'C5', 'C6', 'D2', 'D3', 'D4', 'D5', 'D6'])
def generate_reflection_file(reflection_key):
    r"""

    Parameters
    ----------
    reflection_key: str

    Returns
    -------

    """
    refl = reflections[reflection_key]
    if not os.path.exists(refl['nexus']):
        message = '{} not found. Not creating geometry'.format(refl['nexus'])
        raise FileExistsError(message)
    inst_name = "BASIS"
    # Set header information
    comment = "Created by Michael Reuter and Jose Borreguero"
    # Time needs to be in UTC?
    valid_from = "2014-01-01 00:00:00"

    xml_outfile = '{}_Definition_Si{}.xml'.format(inst_name, reflection_key)
    nfile = h5py.File(refl['nexus'], 'r')

    det = MantidGeom(inst_name, comment=comment, valid_from=valid_from)
    det.addSnsDefaults(indirect=True)
    det.addComment("SOURCE AND SAMPLE POSITION")
    det.addModerator(-84.0)
    det.addSamplePosition()
    det.addComment("MONITORS")
    det.addMonitors(names=["monitor1"], distance=["-0.23368"], neutronic=True)

    # Create the inelastic banks information
    det.addComment('INELASTIC DECTECTORS')
    det.addComponent('silicon')
    handle_silicon = det.makeTypeElement("silicon")
    # Slicer for removing ghosts. Due to the mapping, the ghost tubes sit
    # on the same sides of the arrays for all banks.
    remove_ghosts = slice(-INELASTIC_TUBES_NGHOST)

    for i in range(n_inelastic_banks):
        bank_id = "bank%d" % (i+1)
        pixel_id = nfile["/entry/instrument/bank%d/pixel_id" % (i+1)].value[remove_ghosts]
        distance = nfile["/entry/instrument/bank%d/distance" % (i+1)].value[remove_ghosts]
        # theta or polar_angle: angle from the Z-axis towards the X-axis
        polar_angle = nfile["/entry/instrument/bank%d/polar_angle" % (i+1)].value[remove_ghosts]
        polar_angle *= (180.0/math.pi)
        # phi or azimuthal_angle: angle in the XY-plane
        azimuthal_angle = nfile["/entry/instrument/bank%d/azimuthal_angle" % (i+1)].value[remove_ghosts]
        azimuthal_angle *= (180.0/math.pi)

        analyser_wavelength = nfile["/entry/instrument/analyzer%d/wavelength" % (i+1)].value[remove_ghosts]
        analyser_wavelength *= refl['ratio_to_irreducible_hkl']
        analyser_energy = 81.8042051/analyser_wavelength**2

        det.addComponent(bank_id, idlist=bank_id, root=handle_silicon)

        xbank, ybank, zbank = pixels_physical_xyz(i)
        det.addDetectorPixels(bank_id, x=xbank, y=ybank, z=zbank,
                              names=pixel_id, energy=analyser_energy,
                              nr=distance, ntheta=polar_angle,
                              nphi=azimuthal_angle,
                              output_efixed=refl['efixed'])

        det.addDetectorPixelsIdList(bank_id, r=distance, names=pixel_id,
                                    elg="multiple_ranges")


    # Create the diffraction bank information
    det.addComponent("elastic", "elastic")
    handle = det.makeTypeElement("elastic")

    idlist = []

    detector_z = [-2.1474825, -1.704594, -1.108373, -0.4135165, 0.3181,
                  1.0218315, 1.6330115, 2.0993535, 2.376999]
    detector_x = [1.1649855, 1.7484015, 2.175541, 2.408594, 2.422933,
                  2.216378, 1.8142005, 1.247867, 0.5687435]
    detector_y = [-0.001807, -0.001801, -0.0011845, -0.0006885, -0.0013145,
                  -0.001626, -0.001397, 0.0003465, -0.0001125]

    for i in range(ELASTIC_BANK_START, ELASTIC_BANK_END+1):
        bank_name = "bank%d" % i
        det.addComponent(bank_name, root=handle)

        k = i - ELASTIC_BANK_START

        x_coord = detector_x[k]
        y_coord = detector_y[k]
        z_coord = detector_z[k]

        det.addDetector(x_coord, y_coord, z_coord, 0.0, 0., 90.,
                        bank_name, "tube-elastic", facingSample=True)

        idlist.append(ELASTIC_DETECTORID_START +
                      ELASTIC_TUBE_NPIXELS*(i-ELASTIC_BANK_START))
        idlist.append(ELASTIC_DETECTORID_START +
                      ELASTIC_TUBE_NPIXELS*(i-ELASTIC_BANK_START) +
                      ELASTIC_TUBE_NPIXELS-1)
        idlist.append(None)

    # Diffraction tube information
    det.addComment("ELASTIC TUBE (90 degrees)")
    det.addPixelatedTube("tube-elastic", ELASTIC_TUBE_NPIXELS,
                         ELASTIC_TUBE_LENGTH, "pixel-elastic-tube",
                         neutronic=True, neutronicIsPhysical=True)

    # Set the diffraction pixel Ids
    det.addDetectorIds("elastic", idlist)

    # Creating diffraction pixel
    det.addComment("PIXEL FOR DIFFRACTION TUBES")
    det.addCylinderPixel("pixel-elastic-tube",
                         (0.0, 0.0, 0.0), (0.0, 1.0, 0.0),
                         (ELASTIC_TUBE_WIDTH/2.0),
                         (ELASTIC_TUBE_LENGTH/ELASTIC_TUBE_NPIXELS))

    det.addComment("PIXEL FOR INELASTIC TUBES")
    det.addCylinderPixel("pixel", (0.0, 0.0, 0.0), (0.0, 1.0, 0.0),
                        INELASTIC_TUBE_WIDTH * (1.0-INELASTIC_PIXEL_RADIUS_GAP_RATIO) / 2.0,
                        INELASTIC_TUBE_LENGTH * (1.0-INELASTIC_PIXEL_HEIGHT_GAP_RATIO) / INELASTIC_TUBE_NPIXEL,
                        is_type="detector", algebra="cyl-approx")

    det.addComment("MONITOR SHAPE")
    det.addComment("FIXME: Do something real here.")
    det.addDummyMonitor(0.01, 0.03)

    det.addComment("MONITOR IDs")
    det.addMonitorIds(["-1"])

    det.writeGeom(xml_outfile)

    # Always clean after yourself
    nfile.close()
def main():
    from helper import MantidGeom
    
    inst_name = "VISION"
    
    xml_outfile = inst_name+"_Definition.xml"
    
    comment = " Created by Stuart Campbell "
    valid_from = "2013-10-21 00:00:01"
    
    det = MantidGeom(inst_name, comment=comment, valid_from=valid_from)
    det.addSnsDefaults(indirect=True)
    det.addComment("SOURCE AND SAMPLE POSITION")
    det.addModerator(-16.0)
    det.addSamplePosition()


    # Backscattering Banks are 21-100

    BACKSCATTERING_NTUBES = 80
    BACKSCATTERING_SECTORS = 10
    TUBES_PER_SECTOR = BACKSCATTERING_NTUBES / BACKSCATTERING_SECTORS
    PIXELS_PER_SECTOR = TUBES_PER_SECTOR * 256

    det.addComponent("elastic-backscattering", "elastic-backscattering")
    handle = det.makeTypeElement("elastic-backscattering")

    idlist = []

    for k in range(BACKSCATTERING_SECTORS):
	bankid = 15 + k
	bank_name = "bank%d" % bankid

	#doc_handle = det.makeDetectorElement(bank_name, root=handle)
	
	z_coord = -0.998

	id_start = 14336 + (PIXELS_PER_SECTOR * k)
	id_end = 14336 + (PIXELS_PER_SECTOR * k) + PIXELS_PER_SECTOR - 1


	for l in range(TUBES_PER_SECTOR):


		tube_index = (k*TUBES_PER_SECTOR) + l
		tube_name = bank_name + "-tube" + str(tube_index+1)		

		#det.addComponent(tube_name, root=doc_handle)
		det.addComponent(tube_name, root=handle)

	        angle = -(2.25 + 4.5*tube_index)
        		
        	if tube_index%2 == 0:
            		# Even tube number (long)
            		centre_offset = BS_ELASTIC_LONG_TUBE_INNER_RADIUS + (BS_ELASTIC_LONG_TUBE_LENGTH/2.0)
            		#centre_offset = BS_ELASTIC_LONG_TUBE_INNER_RADIUS
            		component_name = "tube-long-bs-elastic"
        	else:
            		# Odd tube number (short)
            		centre_offset = BS_ELASTIC_SHORT_TUBE_INNER_RADIUS + (BS_ELASTIC_SHORT_TUBE_LENGTH/2.0)
        		component_name = "tube-short-bs-elastic"

        	x_coord = centre_offset * math.cos(math.radians(90-angle))
        	y_coord = centre_offset * math.sin(math.radians(90-angle))

		det.addDetector( x_coord, y_coord, z_coord, 0, 0, -angle, tube_name, component_name)


        idlist.append(id_start)
        idlist.append(id_end)
        idlist.append(None)

    det.addDetectorIds("elastic-backscattering", idlist)


    # 90 elastic banks

    elastic_banklist = [25,26,27,28,29,30]
    elastic_bank_start = [34816,36864,38912,40960,43008,45056]
    elastic_angle = [157.5,-157.5,-67.5,-112.5,-22.5,22.5]


    sample_elastic_distance = 0.635

    det.addComponent("elastic", "elastic")
    handle = det.makeTypeElement("elastic")

    idlist = []
    elastic_index = 0

    for i in elastic_banklist:
        bank_name = "bank%d" % i
        det.addComponent(bank_name, root=handle)

        z_coord = 0.0
        x_coord = sample_elastic_distance * math.cos(math.radians(elastic_angle[elastic_index]))
        y_coord = sample_elastic_distance * math.sin(math.radians(elastic_angle[elastic_index]))

        det.addDetector(x_coord, y_coord, z_coord, -90.0, 180, 0., bank_name, "eightpack-elastic", facingSample=True)

        idlist.append(elastic_bank_start[elastic_index])
        idlist.append(elastic_bank_start[elastic_index]+2047)
        idlist.append(None)

        elastic_index += 1


    det.addDetectorIds("elastic", idlist)

    # Inelastic
    inelastic_banklist = [1,2,3,4,5,6,7,8,9,10,11,12,13,14]
    inelastic_bank_start=[0,1024,2048,3072,4096,5120,6144,7168,8192,9216,10240,11264,12288,13312]
    inelastic_angle = [45.0,0.0,-45.0,-90.0,-135.0,-180.0,135.0,45.0,0.0,-45.0,-90.0,-135.0,-180.0,135.0]
    inelastic_angle_for_rotation = [-45.0,180.0,-135.0,-90.0,-225.0,0.0,45.0,-45.0,180.0,-135.0,-90.0,-225.0,0.0,45.0]

    sample_inelastic_distance = 0.5174

    det.addComponent("inelastic", "inelastic")
    handle = det.makeTypeElement("inelastic")

    idlist = []
    inelastic_index = 0

    for i in inelastic_banklist:
        bank_name = "bank%d" % i
        bank_comp = det.addComponent(bank_name, root=handle, blank_location=True)
#        location_element = le.SubElement(bank_comp, "location")
#        le.SubElement(location_element, "rot", **{"val":"90", "axis-x":"0",
#                                              "axis-y":"0", "axis-z":"1"})

        # Neutronic Positions
        z_coord_neutronic = sample_inelastic_distance * math.tan(math.radians(45.0))

        if inelastic_index+1 > 7:
            # Facing Downstream
            z_coord = -0.01
        else:
            # Facing to Moderator
            z_coord = 0.01
            z_coord_neutronic = -z_coord_neutronic

            # Physical Positions
        x_coord = sample_inelastic_distance * math.cos(math.radians(inelastic_angle[inelastic_index]))
        y_coord = sample_inelastic_distance * math.sin(math.radians(inelastic_angle[inelastic_index]))

        det.addDetector(-x_coord, y_coord, z_coord, 0, 0, inelastic_angle_for_rotation[inelastic_index]-90.0, bank_name,
            "eightpack-inelastic", neutronic=True, nx=-x_coord, ny=y_coord, nz=z_coord_neutronic)

        efixed = ("Efixed", "3.64", "meV")
        det.addDetectorParameters(bank_name, efixed )

        idlist.append(inelastic_bank_start[inelastic_index])
        idlist.append(inelastic_bank_start[inelastic_index]+1023)
        idlist.append(None)

        inelastic_index += 1


    det.addDetectorIds("inelastic", idlist)


    # 8 packs
    
    det.addComment("INELASTIC 8-PACK")
    det.addNPack("eightpack-inelastic", INELASTIC_TUBES_PER_BANK, INELASTIC_TUBE_WIDTH, 
                 INELASTIC_AIR_GAP, "tube-inelastic", neutronic=True)
    
    det.addComment("ELASTIC 8-PACK")
    det.addNPack("eightpack-elastic", ELASTIC_TUBES_PER_BANK, ELASTIC_TUBE_WIDTH, 
                 ELASTIC_AIR_GAP, "tube-elastic", neutronic=True, neutronicIsPhysical=True)
 
    # TUBES
    det.addComment("INELASTIC TUBE")
    det.addPixelatedTube("tube-inelastic", INELASTIC_TUBE_NPIXELS, 
                         INELASTIC_TUBE_LENGTH, "pixel-inelastic-tube", neutronic=True)
    
    det.addComment("BACKSCATTERING LONG TUBE")
    det.addPixelatedTube("tube-long-bs-elastic", BS_ELASTIC_LONG_TUBE_NPIXELS,
        BS_ELASTIC_LONG_TUBE_LENGTH, "pixel-bs-elastic-long-tube",
        neutronic=True, neutronicIsPhysical=True)
    det.addComment("BACKSCATTERING SHORT TUBE")
    det.addPixelatedTube("tube-short-bs-elastic", BS_ELASTIC_SHORT_TUBE_NPIXELS, 
        BS_ELASTIC_SHORT_TUBE_LENGTH, "pixel-bs-elastic-short-tube",
        neutronic=True, neutronicIsPhysical=True)

    det.addComment("ELASTIC TUBE (90 degrees)")
    det.addPixelatedTube("tube-elastic", ELASTIC_TUBE_NPIXELS, 
                         ELASTIC_TUBE_LENGTH, "pixel-elastic-tube", neutronic=True, neutronicIsPhysical=True)

    # PIXELS
    
    det.addComment("PIXEL FOR INELASTIC TUBES")
    det.addCylinderPixel("pixel-inelastic-tube", (0.0, 0.0, 0.0), (0.0, 1.0, 0.0),
                        (INELASTIC_TUBE_WIDTH/2.0),
                        (INELASTIC_TUBE_LENGTH/INELASTIC_TUBE_NPIXELS))
    
    det.addComment("PIXEL FOR BACKSCATTERING ELASTIC TUBES (LONG)")
    det.addCylinderPixel("pixel-bs-elastic-long-tube", (0.0, 0.0, 0.0), (0.0, 1.0, 0.0), 
                         (BS_ELASTIC_LONG_TUBE_WIDTH/2.0), 
                         (BS_ELASTIC_LONG_TUBE_LENGTH/BS_ELASTIC_LONG_TUBE_NPIXELS))

    det.addComment("PIXEL FOR BACKSCATTERING ELASTIC TUBES (SHORT)")
    det.addCylinderPixel("pixel-bs-elastic-short-tube", (0.0, 0.0, 0.0), (0.0, 1.0, 0.0),
                         (BS_ELASTIC_SHORT_TUBE_WIDTH/2.0), 
                         (BS_ELASTIC_SHORT_TUBE_LENGTH/BS_ELASTIC_SHORT_TUBE_NPIXELS))
    
    det.addComment("PIXEL FOR ELASTIC TUBES (90 degrees)")
    det.addCylinderPixel("pixel-elastic-tube", (0.0, 0.0, 0.0), (0.0, 1.0, 0.0),
                         (ELASTIC_TUBE_WIDTH/2.0), 
                         (ELASTIC_TUBE_LENGTH/ELASTIC_TUBE_NPIXELS))

    det.addComment(" ##### MONITORS ##### ")
    det.addMonitors(names=["monitor1","monitor4"], distance=["-6.71625","0.287"], neutronic=True)

    # MONITORS

    det.addComment("MONITOR SHAPE")
    det.addComment("FIXME: All monitors share the dimensions of monitor4.")

    det.addCuboidMonitor(0.051,0.054,0.013)

    det.addComment("MONITOR IDs")
	
    det.addMonitorIds(["-1","-4"])

    #det.showGeom()
    det.writeGeom(xml_outfile)
    # Time needs to be in UTC?
    valid_from = "2018-04-01 00:00:00"

    # Get geometry information file
    xml_outfile = INST_NAME + "_Definition.xml"

    det = MantidGeom(INST_NAME, comment=comment, valid_from=valid_from)
    det.addSnsDefaults(default_view="cylindrical_y")
    det.addComment("SOURCE AND SAMPLE POSITION")
    det.addModerator(-3.289, "monochromator")
    det.addSamplePosition()

    doc_handle = None
    for i in range(NUM_DETS):
        bank = det.addComponent("bank" + str(i + 1),
                                idlist="bank" + str(i + 1),
                                root=doc_handle)
        log = le.SubElement(bank, "parameter", **{"name": "y"})
        le.SubElement(
            log,
            "logfile",
            **{
                "id": "HB2C:Mot:detz.RBV",  # detz is in mm
                "eq":
                "rint(value*100)/100000",  # Round to 0.01mm and convert to metres
                "extract-single-value-as": "mean"
            })

        det_type = "panel"
        angle = (i) * 15 + 7.5  # Mantid
        angle -= 0.03125 * 6  # Offset by six pixels
Beispiel #22
0
    choppersequence="4.185 2.823 4.267 4.248 2.816 2.809 1.388 7.113 1.406 1.41 2.816 4.251 1.403 4.244 5.646 1.43 1.353 1.424 1.429 1.419 1.401 2.803 1.425 2.821 4.262 1.386 7.098 1.403 4.221 4.242 1.332 2.856 4.23 1.437 4.214 7.054 1.423 2.822 2.841 1.38 1.45 2.783 1.446 7.036 1.429 1.384 1.451 1.389 2.847 5.611 1.45 1.379 1.418 1.414 2.866 1.354 1.437 4.225 5.643 2.803 1.444 1.411 2.803 8.488 1.38 5.678 2.838 1.393 2.838 1.411 2.823 4.238 1.379 2.833 2.821 1.402 1.423 1.4 1.421 1.412 8.471 1.415 2.865 1.394 2.805 2.83 4.208 2.851 1.383 2.854 1.299 1.557 4.136 5.692 4.213 1.437 1.345 2.867 2.831 1.426 9.876 4.296 1.388 1.392 1.438 1.376 2.833 1.415 1.42 1.411 1.444 2.789 2.86 5.592 7.069 2.876 9.821 1.417 1.449 1.404 1.41 1.431 1.406 5.642 1.411 2.818 1.405 2.85"
    det.addChopper("correlation-chopper",-2.000653,["Speed (Hz)","BL9:Chop:Skf4:MotorSpeed"])
    det.addCorrelationChopper("correlation-chopper",sequence=choppersequence)
    det.addDetectorStringParameters("correlation-chopper",("sequence",choppersequence))

    row_id = ""
    row_id_list = []
    doc_handle = None
    for i in range(num_dets):
        location = detinfo["Location"][i]
    
        if row_id != location[0]:
            row_id = location[0]
            row_id_list.append(row_id)
            row_id_str = row_id + " row"
            det.addComponent(row_id_str, row_id_str)
            doc_handle = det.makeTypeElement(row_id_str)

        det.addComponent("bank"+str(i+1), root=doc_handle)
        
        xpos = convert(detinfo["Xsci"][i])
        ypos = convert(detinfo["Ysci"][i])
        zpos = convert(detinfo["Zsci"][i])
        det_type = "sixteenpack"
        
        det.addDetector(xpos, ypos, zpos, 
                        detinfo["Xrot_sci"][i], detinfo["Yrot_sci"][i], detinfo["Zrot_sci"][i],
                        "bank"+str(i+1), det_type)

    det.addComment("16-PACK")
    det.addNPack("sixteenpack", NUM_TUBES_PER_BANK, TUBE_WIDTH, AIR_GAP_WIDTH)
Beispiel #23
0
    det.addMonitors(names=["monitor1"], distance=["-0.23368"])


    for i in range(banks):
        pixel_id = file["/entry/instrument/bank%d/pixel_id" % (i+1)].value
        distance = file["/entry/instrument/bank%d/distance" % (i+1)].value
        polar_angle = file["/entry/instrument/bank%d/polar_angle" % (i+1)].value
        polar_angle *= (180.0/math.pi)
        azimuthal_angle = file["/entry/instrument/bank%d/azimuthal_angle" % (i+1)].value
        azimuthal_angle *= (180.0/math.pi)
        
        analyser_wavelength = file["/entry/instrument/analyzer%d/wavelength" % (i+1)].value
        analyser_energy = 81.8042051/analyser_wavelength**2

        bank_id = "bank%d" % (i+1)
        det.addComponent(bank_id, bank_id)
        #doc_handle = det.makeTypeElement(bank_id)

        det.addDetectorPixels(bank_id, r=distance, theta=polar_angle,
                              phi=azimuthal_angle, names=pixel_id, energy=analyser_energy)

        det.addDetectorPixelsIdList(bank_id, r=distance, names=pixel_id)

    # Pixel Height
    y_pixel_offset = file["/entry/instrument/bank1/y_pixel_offset"].value
    pixel_ysize = y_pixel_offset[1] - y_pixel_offset[0]

    # Pixel Width
    x_pixel_offset = file["/entry/instrument/bank1/x_pixel_offset"].value
    pixel_xsize = x_pixel_offset[1] - x_pixel_offset[0]
    # Time needs to be in UTC?
    valid_from = "2018-04-01 00:00:00"

    # Get geometry information file
    xml_outfile = INST_NAME+"_Definition.xml"

    det = MantidGeom(INST_NAME, comment=comment, valid_from=valid_from)
    det.addSnsDefaults(default_view="cylindrical_y")
    det.addComment("SOURCE AND SAMPLE POSITION")
    det.addModerator(-3.289, "monochromator")
    det.addSamplePosition()

    doc_handle = None
    for i in range(NUM_DETS):
        bank = det.addComponent("bank"+str(i+1),
                                idlist="bank"+str(i+1),
                                root=doc_handle)
        log = le.SubElement(bank, "parameter", **{"name": "y"})
        le.SubElement(log, "logfile",
                      **{"id": "HB2C:Mot:detz.RBV", # detz is in mm
                         "eq": "rint(value*100)/100000", # Round to 0.01mm and convert to metres
                         "extract-single-value-as": "mean"})

        det_type = "panel"
        angle = (i)*15+7.5  # Mantid
        angle -= 0.03125*6 # Offset by six pixels
        #angle = i*15+7.5  # Flipped

        type_element = le.SubElement(det.getRoot(), "type",
                                     name="bank"+str(i+1))
        comp_element = le.SubElement(type_element, "component",
Beispiel #25
0
    xml_outfile = inst_name+"_Definition.xml"

    nfile = h5py.File(nexusfile, 'r')

    det = MantidGeom(inst_name, comment=comment, valid_from=valid_from)
    det.addSnsDefaults(indirect=True)
    det.addComment("SOURCE AND SAMPLE POSITION")
    det.addModerator(-84.0)
    det.addSamplePosition()
    det.addComment("MONITORS")
    det.addMonitors(names=["monitor1"], distance=["-0.23368"], neutronic=True)

    # Create the inelastic banks information
    det.addComment("INELASTIC DECTECTORS")
    det.addComponent("silicon")
    handle_silicon = det.makeTypeElement("silicon")
    # Slicer for removing ghosts. Due to the mapping, the ghost tubes sit 
    # on the same sides of the arrays for all banks.
    remove_ghosts = slice(-INELASTIC_TUBES_NGHOST)    
    
    for i in range(banks):
        pixel_id = nfile["/entry/instrument/bank%d/pixel_id" % (i+1)].value[remove_ghosts]
        distance = nfile["/entry/instrument/bank%d/distance" % (i+1)].value[remove_ghosts]
        polar_angle = nfile["/entry/instrument/bank%d/polar_angle" % (i+1)].value[remove_ghosts]
        polar_angle *= (180.0/math.pi)
        azimuthal_angle = nfile["/entry/instrument/bank%d/azimuthal_angle" % (i+1)].value[remove_ghosts]
        azimuthal_angle *= (180.0/math.pi)
        
        analyser_wavelength = nfile["/entry/instrument/analyzer%d/wavelength" % (i+1)].value[remove_ghosts]
        analyser_energy = 81.8042051/analyser_wavelength**2
                       valid_from="2012-08-01 00:00:01")
    instr.addComment("DEFAULTS")
    instr.addSnsDefaults()
    instr.addComment("SOURCE")
    instr.addModerator(-19.5)
    instr.addComment("SAMPLE")
    instr.addSamplePosition()

    # monitors
    instr.addComment("MONITORS")
    instr.addMonitors([-0.879475, 5.748782], ["monitor1", "monitor2"])

    # add the empty components
    for i in range(1, 7):
        name = "Group%d" % i
        instr.addComponent(name, idlist=name)

    # add the id lists for groups
    info = instr.addDetectorIds("Group1", makeIds(14, 0, 8 * 128))
    info = instr.addDetectorIds("Group2", makeIds(23, 14336, 8 * 128))
    info = instr.addDetectorIds("Group3", makeIds(14, 37888, 8 * 128))
    info = instr.addDetectorIds("Group4", makeIds(12, 52224, 8 * 128))
    info = instr.addDetectorIds("Group5", makeIds(18, 64512, 8 * 128))
    info = instr.addDetectorIds("Group6", makeIds(18, 82944, 8 * 128))

    # ---------- add in group1
    """
;;;source idl code
N_first=14
z0_first=6.41/8.45*3.2
x0_first=1.31/8.45*3.2
                       valid_from="2012-08-01 00:00:01")
    instr.addComment("DEFAULTS")
    instr.addSnsDefaults()
    instr.addComment("SOURCE")
    instr.addModerator(-19.5)
    instr.addComment("SAMPLE")
    instr.addSamplePosition()

    # monitors
    instr.addComment("MONITORS")
    instr.addMonitors([-0.879475,5.748782], ["monitor1", "monitor2"])

    # add the empty components
    for i in range(1,7):
        name = "Group%d" % i
        instr.addComponent(name, idlist=name)

    # add the id lists for groups
    info = instr.addDetectorIds("Group1", makeIds(14,     0, 8*128))
    info = instr.addDetectorIds("Group2", makeIds(23, 14336, 8*128))
    info = instr.addDetectorIds("Group3", makeIds(14, 37888, 8*128))
    info = instr.addDetectorIds("Group4", makeIds(12, 52224, 8*128))
    info = instr.addDetectorIds("Group5", makeIds(18, 64512, 8*128))
    info = instr.addDetectorIds("Group6", makeIds(18, 82944, 8*128))

    # ---------- add in group1
    """
;;;source idl code
N_first=14
z0_first=6.41/8.45*3.2
x0_first=1.31/8.45*3.2
Beispiel #28
0
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()
Beispiel #29
0
    aperture1.setHelper("CenteredRectangle")
    aperture1.addVariable("cenDistance", "slit1Sam")
    aperture1.addVariable("xExtent", "s1width")
    aperture1.addVariable("yExtent", "s1height")
    instrument.addComponent(aperture1)
    """

    # guides - not even copying the text

    # mapping of groups to column names
    cols = {4:['B'], 3:['C', 'D'], 2:['E', 'F'], 1:['G', 'H', 'I', 'J', 'K', 'L']}

    # add the empty components
    for i in cols.keys():
        name = "Group%d" % i
        group = instr.addComponent(name)#, idlist=name)

    # add the columns to the group
    for groupNum in cols.keys():
        name = "Group%d" % groupNum
        group = instr.makeTypeElement(name)

        for column in cols[groupNum]:
            name = "Column%d" % ("ABCDEFGHIJKL".index(column) + 1)
            instr.addComponent(name, root=group)

    # the actual work of adding the detectors
    corners = CornersFile("PG3_geom_2013_txt.csv", abs(L1))
    addGroup(corners, cols[4], ["B2", "B3", "B4", "B5", "B6"])
    addGroup(corners, cols[3], ['C2', 'C3',  'C4', 'C5', 'C6', 'D2', 'D3', 'D4', 'D5', 'D6'])
    addGroup(corners, cols[2], ['E2', 'E3', 'E4', 'E5', 'F2', 'F3', 'F4', 'F5'])
in16b.addMonitorIds([0])

in16b.addComment("Detector")
in16b.addComponentILL("detector", 0, 0, 0)
detector = in16b.makeTypeElement("detector")

# create tubes id lists
for i in range(number_of_tubes):
    in16b.addDetectorIds("tube_{0}_ids".format(i + 1),
                         [pixel_per_tube * i + 1, pixel_per_tube * (i + 1), 1])

# create standard tube component and place them
tube = in16b.makeTypeElement("tube")
for i in range(number_of_tubes):
    current_tube = in16b.addComponent('tube',
                                      idlist="tube_{0}_ids".format(i + 1),
                                      root=detector)
    in16b.addLocation(root=current_tube,
                      x=0,
                      y=pow(-1, i) * vertical_offset,
                      z=0,
                      rot_y=-tube_angles[i],
                      name="tube_{0}".format(i + 1))

# add a pixel component to the tube component
tube_pixel = in16b.addComponent(root=tube, type_name='pixel')

# place pixels on the standard tube component
for i in range(pixel_per_tube):
    in16b.addLocation(root=tube_pixel,
                      x=(pixel_per_tube // 2 - i) / pixel_per_tube *
bank = le.SubElement(root, 'type', name='bank')
tubes = le.SubElement(bank, 'component', type='tube')
for boxIndex, boxAngle in enumerate(boxAngles):
    for tubeIndex in range(numberOfTubesPerBox):
        tubeAngle = boxAngle - boxAngleWidth / 2. + tubeIndex * tubeAngleStep
        x = l2 * np.sin(np.deg2rad(tubeAngle))
        y = tubeVerticalShift
        z = l2 * np.cos(np.deg2rad(tubeAngle))
        attributes = {
            'x': str(x),
            'y': str(y),
            'z': str(z),
            'rot': str(tubeAngle),
            'axis-x': str(0.),
            'axis-y': str(1.),
            'axis-z': str(0.),
            'name': 'tube_{}'.format(boxIndex * numberOfTubesPerBox + tubeIndex + 1)
        }
        le.SubElement(tubes, 'location', **attributes)
tubeType = le.SubElement(root, 'type', name='tube', outline='yes')
tube = le.SubElement(tubeType, 'component', type='pixel')
pixelPositions = np.linspace(-tubeHeight/2., tubeHeight/2., numberOfPixelsPerTube)
for pos in pixelPositions:
    le.SubElement(tube, 'location', y=str(pos))
geometry.addComponent('detectors', idlist='detectors')
detectorType = le.SubElement(root, 'type', name='detectors')
bankComponent = le.SubElement(detectorType, 'component', type='bank')
le.SubElement(bankComponent, 'location')
geometry.addDetectorIds('detectors', [1, 73728, None])
geometry.writeGeom("./ILL/IDF/" + instrumentName + "_Definition.xml")
    inst_name = "CNCS"
    detinfo = read_file(geom_input_file)
    num_dets = len(detinfo.values()[0])
    xml_outfile = inst_name+"_Definition.xml"
 
    det = MantidGeom(inst_name, comment=comment, valid_from=valid_from)
    det.addSnsDefaults()
    det.addComment("SOURCE AND SAMPLE POSITION")
    det.addModerator(-36.262)
    det.addSamplePosition()
    det.addComment("MONITORS")
    det.addMonitors(names=["monitor1", "monitor2", "monitor3"],
                    distance=["-29.949", "-28.706", "-1.416"])

    label = "detectors"
    det.addComponent(label, label)
    doc_handle = det.makeTypeElement(label)
    for i in range(num_dets):
        det.addComponent(detinfo["name"][i], root=doc_handle)
        det.addDetector(detinfo["X"][i], detinfo["Y"][i],
                        detinfo["Z"][i], detinfo["RotX"][i],
                        detinfo["RotY"][i], detinfo["RotZ"][i],
                        detinfo["name"][i], "eightpack")

    det.addComment("STANDARD 8-PACK")
    det.addNPack("eightpack", NUM_TUBES_PER_BANK, TUBE_WIDTH, AIR_GAP_WIDTH)

    det.addComment("STANDARD 2m 128 PIXEL TUBE")
    det.addPixelatedTube("tube", NUM_PIXELS_PER_TUBE, TUBE_SIZE)

    det.addComment("PIXEL FOR STANDARD 2m 128 PIXEL TUBE")
    #for i, key in enumerate(positionsSurvey.keys()):
    #    positions[key] = positionsSurvey[key]

    num_banks = [14, 23, 14,12, 18, 18]

    ####################
    # add the id lists for groups - [start, stop, step]
    start, stop = -1, -1
    for i, num_banks_in_pack in enumerate(num_banks):
        start = stop+1
        stop = start + num_banks_in_pack*8*128-1
        info = instr.addDetectorIds('Group%d' % (i+1), [start, stop, None])

    for i, _ in enumerate(num_banks):
        group = 'Group%d' % (i+1)
        group = instr.addComponent(group, idlist=group)

    ####################
    # group 1 is banks 1-14 (inclusive)
    bank_offset = 0
    group = instr.makeTypeElement('Group1')
    for i in range(num_banks[0]):
        bank_num = bank_offset + i + 1
        bank = "bank%d" % bank_num
        corners = getCorners(bank_num)
        rect = getRectangle(bank_num, positions, corners)
       	det = instr.makeDetectorElement('pack', root=group)
       	rect.makeLocation(instr, det, bank)

    # group 2 is banks 15-37 (inclusive)
    bank_offset += num_banks[0]
d7.addMonitors(names=["monitor1", "monitor2"], distance=[zMon1, zMon2])
d7.addComment("MONITOR SHAPE")
d7.addComment("FIXME: Do something real here.")
d7.addDummyMonitor(0.01, 0.03)
d7.addComment("MONITOR IDs")
d7.addMonitorIds([repr(100000), repr(100001)])
d7.addComment("DETECTORS")
d7.addComponentILL("detector", 0., 0., 0.)
detector = d7.makeTypeElement("detector")

# define detector banks
d7.addDetectorIds("bank2_ids", [1, 44, 1])
d7.addDetectorIds("bank3_ids", [45, 88, 1])
d7.addDetectorIds("bank4_ids", [89, 132, 1])
bank = d7.makeTypeElement("bank")
bank2 = d7.addComponent("bank", idlist="bank2_ids", root=detector)
bank3 = d7.addComponent("bank", idlist="bank3_ids", root=detector)
bank4 = d7.addComponent("bank", idlist="bank4_ids", root=detector)

# define detector banks initial positions
d7.addLocation(root=bank2,
               x=0,
               y=0,
               z=0,
               rot_y=repr(-(minTwoTheta + 0.5 * numberDetectors)),
               name="bank2")
d7.addLocation(root=bank3,
               x=0,
               y=0,
               z=0,
               rot_y=repr(-(minTwoTheta + 1.5 * numberDetectors + 2)),