def test_lattice2(self):
     self.lattice = impact.read_lattice(StringIO(self.LATTICE2)) 
     # header line 1
     self.assertEqual(self.lattice.nprocessors, 2)
     # header line 2
     self.assertEqual(self.lattice.ndimensions, 6)
     self.assertEqual(sum(self.lattice.nparticles), 3000)
     self.assertEqual(self.lattice.integrator, 1)
     self.assertEqual(self.lattice.errorStudy, 0)
     self.assertEqual(self.lattice.outputMode, 3)
     # header line 3
     self.assertItemsEqual(self.lattice.meshSize, [ 33, 33, 65 ])
     self.assertEqual(self.lattice.meshMode, 4)
     for idx, value in enumerate([ 0.16, 0.18 ]):
         self.assertAlmostEqual(self.lattice.pipeSize[idx], value)
     self.assertAlmostEqual(self.lattice.periodSize, 0.44)
     # header line 4
     self.assertEqual(self.lattice.inputMode, 3)
     self.assertEqual(self.lattice.restart, 0)
     self.assertEqual(self.lattice.subcycle, 0)
     self.assertEqual(self.lattice.nstates, 2)
     # header line 5
     for idx, value in enumerate([ 1000, 2000 ]):
         self.assertEqual(self.lattice.nparticles[idx], value)
     # header line 6
     for idx, value in enumerate([ 0.01, 0.02 ]):
         self.assertAlmostEqual(self.lattice.current[idx], value)
     # header line 7
     for idx, value in enumerate([1.48e-10, 2.28e-10 ]):
         self.assertEqual(self.lattice.charge[idx], value)
     # header line 8
     self.assertAlmostEqual(self.lattice.distSigma[0], 0.00276)
     self.assertAlmostEqual(self.lattice.distLambda[0], 4.68274e-05)
     self.assertAlmostEqual(self.lattice.distMu[0], 0.11)
     self.assertAlmostEqual(self.lattice.mismatch[0], 1.1)
     self.assertAlmostEqual(self.lattice.emismatch[0], 1.4)
     self.assertAlmostEqual(self.lattice.offset[0], 0.07)
     self.assertAlmostEqual(self.lattice.eoffset[0], 0.08)
     # header line 9
     self.assertAlmostEqual(self.lattice.distSigma[1], 0.00387)
     self.assertAlmostEqual(self.lattice.distLambda[1], 5.92732e-05)
     self.assertAlmostEqual(self.lattice.distMu[1], 0.21)
     self.assertAlmostEqual(self.lattice.mismatch[1], 1.2)
     self.assertAlmostEqual(self.lattice.emismatch[1], 1.5)
     self.assertAlmostEqual(self.lattice.offset[1], 0.08)
     self.assertAlmostEqual(self.lattice.eoffset[1], 0.07)
     # header line 10
     self.assertAlmostEqual(self.lattice.distSigma[2], 0.07674)
     self.assertAlmostEqual(self.lattice.distLambda[2], 8.09374e-06)
     self.assertAlmostEqual(self.lattice.distMu[2], 0.31)
     self.assertAlmostEqual(self.lattice.mismatch[2], 1.3)
     self.assertAlmostEqual(self.lattice.emismatch[2], 1.6)
     self.assertAlmostEqual(self.lattice.offset[2], 0.09)
     self.assertAlmostEqual(self.lattice.eoffset[2], 0.06)
     # header line 11
     self.assertAlmostEqual(self.lattice.initialCurrent, 0.05)
     self.assertAlmostEqual(self.lattice.initialEnergy, 400000.0)
     self.assertAlmostEqual(self.lattice.particleMass, 936.0)
     self.assertAlmostEqual(self.lattice.initialCharge, 0.24325653)
     self.assertAlmostEqual(self.lattice.scalingFreq, 6500000.0)
     self.assertAlmostEqual(self.lattice.initialPhase, 0.0)
     self.assertAlmostEqual(self.lattice.beamPercent, 99.9)
     # lattice elements
     elements = self.lattice.elements
     # value element
     self.assertEqual(elements[0].name, "DRIFT")
     self.assertEqual(elements[0].etype, "DRIFT")
     self.assertAlmostEqual(elements[0].length, 0.0761235)
     self.assertAlmostEqual(elements[0].position, 0.6558303)
     # solenoid element
     self.assertEqual(elements[1].name, "LS1_CA01:SOL1_D1131")
     self.assertEqual(elements[1].etype, "SOL")
     self.assertAlmostEqual(elements[1].length, 0.1)
     self.assertAlmostEqual(elements[1].position, 0.74333034)
     self.assertEquals(len(elements[1].fields), 1)
     self.assertEquals(elements[1].fields[0].name, "B")
     self.assertEqual(elements[1].fields[0].unit, "T")
     self.assertEqual(elements[1].fields[0].index, 4)
     # horiz. corrector element
     self.assertEqual(elements[2].name, "LS1_CA01:DCH_D1131")
     self.assertEqual(elements[2].etype, "HCOR")
     self.assertAlmostEqual(elements[2].length, 0.0)
     self.assertAlmostEqual(elements[2].position, 0.74333034)
     self.assertEquals(len(elements[2].fields), 1)
     self.assertEquals(elements[2].fields[0].name, "ANG")
     self.assertEqual(elements[2].fields[0].unit, "rad")
     self.assertEqual(elements[2].fields[0].index, 6)
     # vert. corrector element
     self.assertEqual(elements[3].name, "LS1_CA01:DCV_D1131")
     self.assertEqual(elements[3].etype, "VCOR")
     self.assertAlmostEqual(elements[3].length, 0.0)
     self.assertAlmostEqual(elements[3].position, 0.74333034)
     self.assertEquals(len(elements[3].fields), 1)
     self.assertEquals(elements[3].fields[0].name, "ANG")
     self.assertEqual(elements[3].fields[0].unit, "rad")
     self.assertEqual(elements[3].fields[0].index, 8)
     # solenoid element
     self.assertEqual(elements[4].name, "LS1_CA01:SOL1_D1131")
     self.assertEqual(elements[4].etype, "SOL")
     self.assertAlmostEqual(elements[4].length, 0.1)
     self.assertAlmostEqual(elements[4].position, 0.8433303)
     self.assertEquals(len(elements[4].fields), 1)
     self.assertEquals(elements[4].fields[0].name, "B")
     self.assertEqual(elements[4].fields[0].unit, "T")
     self.assertEqual(elements[4].fields[0].index, 4)
 def test_lattice1(self):
     self.lattice = impact.read_lattice(StringIO(self.LATTICE1)) 
     # header line 1
     self.assertEqual(self.lattice.nprocessors, 4)
     # header line 2
     self.assertEqual(self.lattice.ndimensions, 6)
     self.assertEqual(self.lattice.nparticles, 1000)
     self.assertEqual(self.lattice.integrator, 2)
     self.assertEqual(self.lattice.errorStudy, 0)
     self.assertEqual(self.lattice.outputMode, 1)
     # header line 3
     self.assertItemsEqual(self.lattice.meshSize, [ 65, 65, 129 ])
     self.assertEqual(self.lattice.meshMode, 4)
     for idx, value in enumerate([ 0.14, 0.14 ]):
         self.assertAlmostEqual(self.lattice.pipeSize[idx], value)
     self.assertAlmostEqual(self.lattice.periodSize, 0.1025446)
     # header line 4
     self.assertEqual(self.lattice.inputMode, 3)
     self.assertEqual(self.lattice.restart, 0)
     self.assertEqual(self.lattice.subcycle, 0)
     self.assertEqual(self.lattice.nstates, 1)
     # header line 5
     self.assertEqual(self.lattice.nparticles, 1000)
     # header line 6
     self.assertEqual(self.lattice.current, 0.0)
     # header line 7
     self.assertEqual(self.lattice.charge, 1.48852718947e-10)
     # header line 8
     self.assertAlmostEqual(self.lattice.distSigma[0], 0.0022734189)
     self.assertAlmostEqual(self.lattice.distLambda[0], 8.8312578e-05)
     self.assertAlmostEqual(self.lattice.distMu[0], 0.0)
     self.assertAlmostEqual(self.lattice.mismatch[0], 1.0)
     self.assertAlmostEqual(self.lattice.emismatch[0], 1.0)
     self.assertAlmostEqual(self.lattice.offset[0], 0.0)
     self.assertAlmostEqual(self.lattice.eoffset[0], 0.0)
     # header line 9
     self.assertAlmostEqual(self.lattice.distSigma[1], 0.0022734189)
     self.assertAlmostEqual(self.lattice.distLambda[1], 8.8312578e-05)
     self.assertAlmostEqual(self.lattice.distMu[1], 0.0)
     self.assertAlmostEqual(self.lattice.mismatch[1], 1.0)
     self.assertAlmostEqual(self.lattice.emismatch[1], 1.0)
     self.assertAlmostEqual(self.lattice.offset[1], 0.0)
     self.assertAlmostEqual(self.lattice.eoffset[1], 0.0)
     # header line 10
     self.assertAlmostEqual(self.lattice.distSigma[2], 0.076704772)
     self.assertAlmostEqual(self.lattice.distLambda[2], 3.4741445e-06)
     self.assertAlmostEqual(self.lattice.distMu[2], 0.0)
     self.assertAlmostEqual(self.lattice.mismatch[2], 1.0)
     self.assertAlmostEqual(self.lattice.emismatch[2], 1.0)
     self.assertAlmostEqual(self.lattice.offset[2], 0.0)
     self.assertAlmostEqual(self.lattice.eoffset[2], 0.0)
     # header line 11
     self.assertAlmostEqual(self.lattice.initialCurrent, 0.0)
     self.assertAlmostEqual(self.lattice.initialEnergy, 500000.0)
     self.assertAlmostEqual(self.lattice.particleMass, 931494320.0)
     self.assertAlmostEqual(self.lattice.initialCharge, 0.138655462185)
     self.assertAlmostEqual(self.lattice.scalingFreq, 80500000.0)
     self.assertAlmostEqual(self.lattice.initialPhase, 0.0)
     self.assertAlmostEqual(self.lattice.beamPercent, 99.9)
     # lattice elements
     elements = self.lattice.elements
     # value element
     self.assertEqual(elements[0].name, "DRIFT")
     self.assertEqual(elements[0].etype, "VALVE")
     self.assertAlmostEqual(elements[0].length, 0.072)
     self.assertAlmostEqual(elements[0].position, 0.072)
     # dift element
     self.assertEqual(elements[1].name, "DRIFT")
     self.assertEqual(elements[1].etype, "DRIFT")
     self.assertAlmostEqual(elements[1].length, 0.1350635)
     self.assertAlmostEqual(elements[1].position, 0.19094025)
     # cavity element
     self.assertEqual(elements[2].name, "LS1_CA01:CAV1_D1127")
     self.assertEqual(elements[2].etype, "CAV")
     self.assertAlmostEqual(elements[2].length, 0.24)
     self.assertAlmostEqual(elements[2].position, 0.4470635)
     self.assertEquals(len(elements[2].fields), 2)
     self.assertIn("AMP", [ f.name for f in elements[2].fields ])
     self.assertIn("PHA", [ f.name for f in elements[2].fields ])
     for f in elements[2].fields:
         if f.name == "AMP":
             self.assertEqual(f.unit, "V")
             self.assertEqual(f.index, 4)
         elif f.name == "PHA":
             self.assertEqual(f.unit, "deg")
             self.assertEqual(f.index, 6)
Esempio n. 3
0
    def _form_upload_post(self, send_status):
        """Process the request and create new Lattice resource.

        :param send_status: callback method to signal completion
        """
        data = self.application.data
        ctx = yield self._create_upload_context()

        content_type = self.handler.request.headers["Content-Type"]
        if not content_type.startswith("multipart/form-data;"):
            send_status(415)
            return

        ctx.lattice.particle_type = self.handler.get_argument("particle_type", "")
        if len(ctx.lattice.particle_type) == 0:
            ctx.errors.particle_type = "Particle Type is required"
        else:
            for p in ctx.particle_types:
                if p["type"] == ctx.lattice.particle_type:
                    particle_type = ObjectDict(p)
                    break
            else:
                ctx.errors.particle_type = "Particle Type '{}' is invalid" \
                                             .format(ctx.lattice.particle_type)

        ctx.lattice.name = self.handler.get_argument("name", "")
        if len(ctx.lattice.name) == 0:
            ctx.errors.name = "Name is required"

        ctx.lattice.branch = self.handler.get_argument("branch", "")
        if len(ctx.lattice.branch) == 0:
            ctx.errors.branch = "Branch is required"

        if self.handler.get_argument("autoversion", "off") == "on":
            ctx.lattice_autoversion = True
        else:
            ctx.lattice_autoversion = False

        ctx.lattice.version = self.handler.get_argument("version", "")
        if not ctx.lattice_autoversion:
            if len(ctx.lattice.version) == 0:
                ctx.errors.version = "Version is required"
            else:
                try:
                    ctx.lattice.version = int(ctx.lattice.version)
                except ValueError:
                    ctx.lattice.version = self._INITIAL_VERSION
                    ctx.errors.version = "Version must be an integer"
                if ctx.lattice.version <= 0:
                    ctx.errors.version = "Version must be greater than zero"

        ctx.lattice.description = self.handler.get_argument("description", "")

        ctx.lattice.status_type = self.handler.get_argument("status_type", "")

        ctx.lattice.created_by = self.handler.current_user

        ctx.lattice.created_date = datetime.now()

        ctx.lattice._id = ObjectId()

        request_files = self.handler.request.files

        if "lattice_file" not in request_files:
            ctx.errors.lattice_file = "Lattice File is required"

        elif len(request_files["lattice_file"]) == 0:
            ctx.errors.lattice_file = "Lattice File is required"

        if ctx.errors:
            send_status(400, ctx)
            return

        # check for another lattice with name, branch and version
        if ctx.lattice_autoversion:
            lattice = yield data.find_lattice_by_name(ctx.lattice.name,
                                                        ctx.lattice.branch)
        else:
            lattice = yield data.find_lattice_by_name(ctx.lattice.name,
                                    ctx.lattice.branch, ctx.lattice.version)

        if ctx.lattice_autoversion:
            if lattice:
                ctx.lattice.version = lattice.version + 1
            else:
                ctx.lattice.version = self._INITIAL_VERSION
        else:
            if lattice:
                ctx.errors.version = "Version already exists"

        if ctx.errors:
            send_status(400, ctx)
            return

        lattice_file = request_files["lattice_file"][0]

        try:
            lattice = read_lattice(StringIO(lattice_file.body))
        except Exception as e:
            LOGGER.warning("Error reading lattice: %s", e)
            ctx.errors.lattice_file = "Lattice File invalid format"

        if ctx.errors:
            send_status(400, ctx)
            return

        ctx.lattice.properties = []

        ctx.lattice.properties.append(dict(
            name="ParticleMass",
            value=lattice.particleMass,
            unit="MeV/c^2"
        ))

        ctx.lattice.properties.append(dict(
            name="ParticleCount",
            value=lattice.nparticles
        ))

        ctx.lattice.properties.append(dict(
            name="ParticleCurrent",
            value=lattice.current,
            unit="A"
        ))

        ctx.lattice.properties.append(dict(
            name="PositionMismatch",
            value=lattice.mismatch
        ))

        ctx.lattice.properties.append(dict(
            name="EnergyMismatch",
            value=lattice.emismatch
        ))

        ctx.lattice.properties.append(dict(
            name="PositionOffset",
            value=lattice.offset
        ))

        ctx.lattice.properties.append(dict(
            name="EnergyOffset",
            value=lattice.eoffset
        ))

        ctx.lattice.properties.append(dict(
            name="DistSigma",
            value=lattice.distSigma
        ))

        ctx.lattice.properties.append(dict(
            name="DistLambda",
            value=lattice.distLambda
        ))

        ctx.lattice.properties.append(dict(
            name="DistMu",
            value=lattice.distMu
        ))

        ctx.lattice.properties.append(dict(
            name="OutputMode",
            value=lattice.outputMode
        ))

        ctx.lattice.properties.append(dict(
            name="IntegratorType",
            value=lattice.integrator
        ))

        nucleons = particle_type.protons + particle_type.neutrons

        # lattice charge states
        if isinstance(lattice.charge, (tuple, list)):
            lattice_charge = []
            for charge in lattice.charge:
                lattice_charge.append(int(charge * lattice.particleMass * nucleons))
        else:
            lattice_charge = int(lattice.charge * lattice.particleMass * nucleons)

        ctx.lattice.properties.append(dict(
            name="ParticleCharge",
            value=lattice_charge
        ))

        ctx.lattice.files = []
        file_content = {}

        file_id = _create_file_id()
        ctx.lattice.files.append(ObjectDict(
            id=file_id,
            name="LatticeFile",
            size=len(lattice_file.body),
            filename=lattice_file.filename,
            location=_create_file_location(lattice_file)
        ))
        file_content[file_id] = lattice_file.body

        for data_file in request_files.get("data_file", []):
            # find a unique file ID
            while True:
                file_id=_create_file_id()
                if file_id not in file_content:
                    break
            ctx.lattice.files.append(ObjectDict(
                id=file_id,
                name="DataFile",
                size=len(data_file.body),
                filename=data_file.filename,
                location=_create_file_location(data_file)
            ))
            file_content[file_id] = data_file.body

        # check that all the data files specified by the
        # lattice have been submitted as attachments
        for filename in lattice.files:
            for f in ctx.lattice.files:
                if f.filename == filename:
                    break
            else:
                ctx.errors.data_file = "Missing data file: " + filename
                send_status(400, ctx)
                return

        attachment_path = self.settings.get("attachment_path", "")
        if len(attachment_path) == 0:
            LOGGER.warn("setting 'attachment_path' not found")
            ctx.errors._global = "Attachment directory not specified"
            send_status(500, ctx)
            return

        if not os.path.isdir(attachment_path):
            LOGGER.error("attachment path '%s' not found", attachment_path)
            ctx.errors._global = "Attachment directory not found"
            send_status(500, ctx)
            return

        try:
            yield data.validate_lattice(ctx.lattice)
        except Exception as e:
            LOGGER.error("lattice validation error: %s", e)
            ctx.errors._global = "Lattice validation error"
            send_status(500, ctx)
            return

        lattice_elements = []
        for idx, element in enumerate(lattice.elements):
            lattice_element = ObjectDict()
            lattice_element.lattice_id = ctx.lattice._id
            lattice_element.order = idx+1
            lattice_element.name = element.name
            lattice_element.type = element.etype
            lattice_element.length = element.length
            lattice_element.position = element.position
            lattice_element.properties = []
            lattice_element.properties.append(dict(
                name="ITYPE",
                value=element.itype
            ))
            lattice_element.properties.append(dict(
                name="STEPS",
                value=element.steps
            ))
            for field in element.fields:
                lattice_element.properties.append(dict(
                    name = field.name,
                    unit = field.unit,
                    value = element.getfield(field.name)
                ))

            try:
                yield data.validate_lattice_element(lattice_element)
            except Exception as e:
                LOGGER.error("lattice element validation error: %s", e)
                ctx.errors._global = "Lattice element validation error"
                send_status(500, ctx)
                return

            lattice_elements.append(lattice_element)

        try:
            lattice_id = yield data.insert_lattice(ctx.lattice, validate=False)
        except Exception as e:
            LOGGER.error("lattice database insert error: %s", e)
            ctx.errors._global = "Lattice database insert error"
            send_status(500, ctx)
            return

        try:
            for lattice_element in lattice_elements:
                lattice_element.lattice_id = lattice_id
                data.insert_lattice_element(lattice_element, validate=False)
        except Exception as e:
            LOGGER.error("lattice element database insert error: %s", e)
            ctx.errors._global = "Lattice element database insert error"
            # Rollback?
            send_status(500, ctx)
            return

        try:
            for f in ctx.lattice.files:
                _write_file_content(attachment_path, f.location, file_content[f.id])
        except Exception as e:
            LOGGER.exception("lattice file write error: %s", e)
            ctx.errors._global = "Lattice file write error"
            #Rollback?
            send_status(500, ctx)
            return

        send_status(201, ctx)
        return