@classmethod
def makeObservationInfo(cls, **kwargs):
    """Construct an `ObservationInfo` from the supplied parameters.

        Notes
        -----
        The supplied parameters should use names matching the property.
        The type of the supplied value will be checked against the property.
        Any properties not supplied will be assigned a value of `None`.

        Raises
        ------
        KeyError
            Raised if a supplied parameter key is not a known property.
        TypeError
            Raised if a supplied value does not match the expected type
            of the property.
        """
    obsinfo = cls(None)
    unused = set(kwargs)
    for p in cls._PROPERTIES:
        if p in kwargs:
            property = f'_{p}'
            value = kwargs[p]
            if not cls._is_property_ok(p, value):
                raise TypeError(
                    f'Supplied value {value} for property {p} should be of class {cls._PROPERTIES[p][1]} not {value.__class__}'
                    )
            setattr(obsinfo, property, value)
            unused.remove(p)
    if unused:
        raise KeyError(f"Unrecognized properties provided: {', '.join(unused)}"
            )
    return obsinfo
