Exemplo n.º 1
0
    def Quadrupole(self, linedict):
        quaddata = linedict['data']
        length = quaddata[
            0]  # First three non-blanks must be the entries in a specific order.
        field_at_tip = quaddata[1]  # Field in TRANSPORT units
        pipe_rad = quaddata[2]  # Pipe Radius In TRANSPORT units

        field_in_Gauss = field_at_tip * self.Transport.scale[
            self.Transport.units['magnetic_fields'][0]]  # Convert to Gauss
        field_in_Tesla = field_in_Gauss * 1e-4  # Convert to Tesla

        pipe_in_metres = pipe_rad * _General.ScaleToMeters(
            self.Transport, 'bend_vert_gap')
        lenInM = length * _General.ScaleToMeters(self.Transport,
                                                 'element_length')

        field_gradient = (
            field_in_Tesla / pipe_in_metres
        ) / self.Transport.beamprops.brho  # K1 in correct units

        self.Transport.machineprops.quads += 1

        elementid = ''
        if self.Transport.convprops.keepName:
            elementid = linedict['name']
        if not elementid:  # check on empty string
            if field_gradient > 0:
                elementid = 'QF' + _np.str(self.Transport.machineprops.quads)
            elif field_gradient < 0:
                elementid = 'QD' + _np.str(self.Transport.machineprops.quads)
            else:
                elementid = 'NULLQUAD' + _np.str(
                    self.Transport.machineprops.quads)  # For K1 = 0.

        # pybdsim and pymadx are the same.
        self.Transport.machine.AddQuadrupole(name=elementid,
                                             length=lenInM,
                                             k1=_np.round(field_gradient, 4))

        string1 = '\tQuadrupole, field in gauss = ' + _np.str(
            field_in_Gauss) + ' G, field in Tesla = ' + _np.str(
                field_in_Tesla) + ' T.'
        string2 = '\tBeampipe radius = ' + _np.str(
            pipe_in_metres) + ' m. Field gradient = ' + _np.str(
                field_in_Tesla / pipe_in_metres) + ' T/m.'
        string3 = '\tBrho = ' + _np.str(
            _np.round(self.Transport.beamprops.brho,
                      4)) + ' Tm. K1 = ' + _np.str(_np.round(
                          field_gradient, 4)) + ' m^-2'
        self.Writer.DebugPrintout(string1)
        self.Writer.DebugPrintout(string2)
        self.Writer.DebugPrintout(string3)
        self.Writer.DebugPrintout('\tConverted to:')
        debugstring = 'Quadrupole ' + elementid + ', length= ' + _np.str(
            lenInM) + ' m, k1= ' + _np.str(_np.round(field_gradient,
                                                     4)) + ' T/m'
        self.Writer.DebugPrintout('\t' + debugstring)
Exemplo n.º 2
0
    def Solenoid(self, linedict):
        soledata = linedict['data']
        length = soledata[
            0]  # First three non-blanks must be the entries in a specific order.
        field = soledata[1]  # Field in TRANSPORT units

        field_in_Gauss = field * self.Transport.scale[
            self.Transport.units['magnetic_fields'][0]]  # Convert to Gauss
        field_in_Tesla = field_in_Gauss * 1e-4  # Convert to Tesla

        lenInM = length * _General.ScaleToMeters(self.Transport,
                                                 'element_length')

        self.Transport.machineprops.solenoids += 1
        elementid = ''
        if self.Transport.convprops.keepName:
            elementid = linedict['name']
        if not elementid:  # check on empty string
            elementid = 'SOLE' + _np.str(self.Transport.machineprops.solenoids)

        # pybdsim and pymadx are the same.
        self.Transport.machine.AddSolenoid(name=elementid,
                                           length=lenInM,
                                           ks=_np.round(field_in_Tesla, 4))

        self.Writer.DebugPrintout('\tConverted to:')
        debugstring = 'Solenoid ' + elementid + ', length ' + _np.str(lenInM) + \
                      ' m, ks ' + _np.str(_np.round(field_in_Tesla, 4)) + ' T'
        self.Writer.DebugPrintout('\t' + debugstring)
Exemplo n.º 3
0
    def Sextupole(self, linedict):
        sextudata = linedict['data']
        length = sextudata[
            0]  # First three non-blanks must be the entries in a specific order.
        field_at_tip = sextudata[1]  # Field in TRANSPORT units
        pipe_rad = sextudata[2]  # Pipe Radius In TRANSPORT units

        field_in_Gauss = field_at_tip * self.Transport.scale[
            self.Transport.units['magnetic_fields'][0]]  # Convert to Gauss
        field_in_Tesla = field_in_Gauss * 1e-4  # Convert to Tesla

        pipe_in_metres = pipe_rad * _General.ScaleToMeters(
            self.Transport, 'bend_vert_gap')
        lenInM = length * _General.ScaleToMeters(self.Transport,
                                                 'element_length')

        field_gradient = (
            2 * field_in_Tesla / pipe_in_metres**
            2) / self.Transport.beamprops.brho  # K2 in correct units

        self.Transport.machineprops.sextus += 1
        elementid = ''
        if self.Transport.convprops.keepName:
            elementid = linedict['name']
        if not elementid:  # check on empty string
            elementid = 'SEXT' + _np.str(self.Transport.machineprops.sextus)

        # pybdsim and pymadx are the same.
        self.Transport.machine.AddSextupole(name=elementid,
                                            length=lenInM,
                                            k2=_np.round(field_gradient, 4))

        self.Writer.DebugPrintout('\tConverted to:')
        debugstring = 'Sextupole ' + elementid + ', length ' + _np.str(lenInM) + \
                      ' m, k2 ' + _np.str(_np.round(field_gradient, 4)) + ' T/m^2'
        self.Writer.DebugPrintout('\t' + debugstring)
Exemplo n.º 4
0
    def Drift(self, linedict):
        driftlen = linedict['length']
        if driftlen <= 0:
            self.Writer.DebugPrintout(
                '\tZero or negative length element, ignoring.')
            return

        lenInM = driftlen * _General.ScaleToMeters(
            self.Transport, 'element_length')  # length in metres

        self.Transport.machineprops.drifts += 1
        elementid = ''
        if self.Transport.convprops.keepName:
            elementid = linedict['name']
        if not elementid:  # check on empty string
            elementid = 'DR' + _np.str(self.Transport.machineprops.drifts)

        # pybdsim and pymadx are the same.
        self.Transport.machine.AddDrift(name=elementid, length=lenInM)

        self.Writer.DebugPrintout('\tConverted to:')
        self.Writer.DebugPrintout('\t' + 'Drift ' + elementid + ', length ' +
                                  _np.str(lenInM) + ' m')
Exemplo n.º 5
0
    def Collimator(self, linedict):
        """
        A Function that writes the properties of a collimator element
        Only added for gmad, not for madx!
        """
        if linedict['length'] <= 0:
            self.Writer.DebugPrintout(
                '\tZero or negative length element, ignoring.')
            return
        colldata = linedict['data']

        # Determine which entry is for horiz. and vert.
        aperx = self.Transport.machineprops.beampiperadius
        apery = self.Transport.machineprops.beampiperadius
        if _np.float(colldata[0]) == 1.0:
            aperx = colldata[1]
        elif _np.float(colldata[0]) == 3.0:
            apery = colldata[1]

        if len(colldata) > 2:
            if _np.float(colldata[2]) == 1.0:
                aperx = colldata[3]
            elif _np.float(colldata[2]) == 3.0:
                apery = colldata[3]
        aperx = _np.float(aperx)
        apery = _np.float(apery)

        lenInM = linedict['length'] * _General.ScaleToMeters(
            self.Transport, 'element_length')
        aperx_in_metres = aperx * _General.ScaleToMeters(self.Transport, 'x')
        apery_in_metres = apery * _General.ScaleToMeters(self.Transport, 'y')

        self.Transport.machineprops.collimators += 1
        elementid = ''
        if self.Transport.convprops.keepName:
            elementid = linedict['name']
        if not elementid:  # check on empty string
            elementid = 'COL' + _np.str(
                self.Transport.machineprops.collimators)

        collimatorMaterial = 'copper'  # Default in BDSIM, added to prevent warnings
        # only call for gmad, warning for madx
        if self.Transport.convprops.gmadoutput:
            self.Transport.machine.AddRCol(name=elementid,
                                           length=lenInM,
                                           xsize=aperx_in_metres,
                                           ysize=apery_in_metres,
                                           material=collimatorMaterial)
        elif self.Transport.convprops.madxoutput:
            self.Writer.DebugPrintout(
                '\tWarning, MadX Builder does not have RCOL')

        debugstring = '\tCollimator, x aperture = ' + _np.str(aperx_in_metres) \
                      + ' m, y aperture = ' + _np.str(apery_in_metres) + ' m.'
        self.Writer.DebugPrintout(debugstring)
        self.Writer.DebugPrintout('\tConverted to:')
        debugstring = 'Collimator ' + elementid + ', length= ' + _np.str(lenInM)\
                      + ' m, xsize= ' + _np.str(_np.round(aperx_in_metres, 4))
        debugstring += ' m, ysize= ' + _np.str(_np.round(apery_in_metres,
                                                         4)) + ' m.'
        self.Writer.DebugPrintout('\t' + debugstring)
Exemplo n.º 6
0
    def Dipole(self, linedict):
        linenum = linedict['linenum']
        dipoledata = linedict['data']
        length = dipoledata[
            0]  # First two non-blanks must be the entries in a specific order.

        # Get poleface rotation
        e1 = linedict['e1'] * (
            (_np.pi / 180.0) * self.Transport.machineprops.bending
        )  # Entrance pole face rotation.
        e2 = linedict['e2'] * (
            (_np.pi / 180.0) * self.Transport.machineprops.bending
        )  # Exit pole face rotation.

        if e1 != 0:
            self.Writer.DebugPrintout(
                '\tPreceding element (' + _np.str(linenum - 1) +
                ') provides an entrance poleface rotation of ' +
                _np.str(_np.round(e1, 4)) + ' rad.')
        if e2 != 0:
            self.Writer.DebugPrintout(
                '\tFollowing element (' + _np.str(linenum + 1) +
                ') provides an exit poleface rotation of ' +
                _np.str(_np.round(e2, 4)) + ' rad.')

        # Fringe Field Integrals
        fintval = 0
        fintxval = 0
        if e1 != 0:
            fintval = self.Transport.machineprops.fringeIntegral
        if e2 != 0:
            fintxval = self.Transport.machineprops.fringeIntegral
        if (fintval != 0) or (fintxval != 0):
            self.Writer.DebugPrintout(
                '\tA previous entry set the fringe field integral K1=' +
                _np.str(self.Transport.machineprops.fringeIntegral) + '.')
        if (fintval != 0) and (e1 != 0):
            self.Writer.DebugPrintout('\tSetting fint=' + _np.str(fintval) +
                                      '.')
        if (fintxval != 0) and (e2 != 0):
            self.Writer.DebugPrintout('\tSetting fintx=' + _np.str(fintxval) +
                                      '.')

        hgap = self.Transport.machineprops.dipoleVertAper * self.Transport.scale[
            self.Transport.units['bend_vert_gap'][0]] * 10

        # Calculate bending angle
        if self.Transport.machineprops.benddef:
            bfield = dipoledata[1]
            field_in_Gauss = bfield * self.Transport.scale[
                self.Transport.units['magnetic_fields'][0]]  # Scale to Gauss
            field_in_Tesla = field_in_Gauss * 1e-4  # Convert to Tesla
            if field_in_Tesla == 0:
                angle = 0  # zero field = zero angle
            else:
                rho = self.Transport.beamprops.brho / (
                    _np.float(field_in_Tesla))  # Calculate bending radius.
                angle = (
                    _np.float(length) / rho
                ) * self.Transport.machineprops.bending  # for direction of bend
            self.Writer.DebugPrintout('\tbfield = ' + _np.str(field_in_Gauss) +
                                      ' kG')
            self.Writer.DebugPrintout('\tbfield = ' + _np.str(field_in_Tesla) +
                                      ' T')
            self.Writer.DebugPrintout('\tCorresponds to angle of ' +
                                      _np.str(_np.round(angle, 4)) + ' rad.')
        else:
            angle_in_deg = dipoledata[1]
            angle = angle_in_deg * (_np.pi /
                                    180.) * self.Transport.machineprops.bending

        # Convert element length
        lenInM = length * _General.ScaleToMeters(self.Transport,
                                                 'element_length')

        self.Transport.machineprops.dipoles += 1
        elementid = ''
        if self.Transport.convprops.keepName:
            elementid = linedict['name']
        if not elementid:  # check on empty string
            elementid = 'BM' + _np.str(self.Transport.machineprops.dipoles)

        # pybdsim and pymadx are the same. Check for non zero pole face rotation.
        if (e1 != 0) and (e2 != 0):
            self.Transport.machine.AddDipole(name=elementid,
                                             category='sbend',
                                             length=lenInM,
                                             angle=_np.round(angle, 4),
                                             e1=_np.round(e1, 4),
                                             e2=_np.round(e2, 4),
                                             fint=fintval,
                                             fintx=fintxval,
                                             hgap=hgap)
        elif (e1 != 0) and (e2 == 0):
            self.Transport.machine.AddDipole(name=elementid,
                                             category='sbend',
                                             length=lenInM,
                                             angle=_np.round(angle, 4),
                                             e1=_np.round(e1, 4),
                                             fint=fintval,
                                             fintx=0,
                                             hgap=hgap)
        elif (e1 == 0) and (e2 != 0):
            self.Transport.machine.AddDipole(name=elementid,
                                             category='sbend',
                                             length=lenInM,
                                             angle=_np.round(angle, 4),
                                             e2=_np.round(e2, 4),
                                             fint=0,
                                             fintx=fintxval,
                                             hgap=hgap)
        else:
            self.Transport.machine.AddDipole(name=elementid,
                                             category='sbend',
                                             length=lenInM,
                                             angle=_np.round(angle, 4))

        # Debug output
        if (e1 != 0) and (e2 != 0):
            polefacestr = ', e1= ' + _np.str(_np.round(
                e1, 4)) + ' rad, e2= ' + _np.str(_np.round(e2, 4)) + ' rad'
        elif (e1 != 0) and (e2 == 0):
            polefacestr = ', e1= ' + _np.str(_np.round(e1, 4)) + ' rad'
        elif (e1 == 0) and (e2 != 0):
            polefacestr = ', e2= ' + _np.str(_np.round(e2, 4)) + ' rad'
        else:
            polefacestr = ''

        if (fintval != 0) and (fintxval != 0):
            fringestr = ' , fint= ' + _np.str(fintval) + ', fintx= ' + _np.str(
                fintxval)
        elif (fintval != 0) and (fintxval == 0):
            fringestr = ' , fint= ' + _np.str(fintval)
        elif (fintval == 0) and (fintxval != 0):
            fringestr = ' , fintx= ' + _np.str(fintxval)
        else:
            fringestr = ''

        self.Writer.DebugPrintout('\tConverted to:')
        debugstring = 'Dipole ' + elementid + ', length= ' + _np.str(lenInM) + ' m, angle= ' + \
                      _np.str(_np.round(angle, 4)) + ' rad' + polefacestr + fringestr
        self.Writer.DebugPrintout('\t' + debugstring)