def build_recipe_input(self, ob, dal):
        result = {}
        ob_query_skip = False
        ob_query_field = 'obresult'
        if isinstance(ob, ObservingBlock):
            import numina.types.obsresult as obtype
            for key, req in self.requirements().items():
                if isinstance(req.type, obtype.ObservationResultType):
                    ob_query_field = key
                    ob_query_skip = True
                    query_option = self.query_options.get(key)
                    new_or = ObservationResult()
                    new_or.__dict__ = ob.__dict__
                    obsres = req.query(dal, new_or, options=query_option)
                    tagger = self.mode.tagger
                    if tagger is not None:
                        self.logger.debug('Use mode tagger to fill tags in OB')
                        obsres.tags = tagger(obsres)
                    else:
                        obsres.tags = None
                    break
            else:
                obsres = ob
        else:
            obsres = ob
        self.logger.debug('getting query fields per REQ')
        qfields = set()
        for key, req in self.requirements().items():
            tag_n = req.tag_names()
            self.logger.debug("%s has these query fields %s", key, tag_n)
            qfields.update(tag_n)
        if obsres.tags is None:
            self.logger.debug('running recipe tagger')
            self.logger.debug('with query fields %s', qfields)
            if qfields:
                obsres.tags = self.obsres_extractor(obsres, qfields)
            else:
                obsres.tags = {}
        for key, req in self.requirements().items():
            try:
                query_option = self.query_options.get(key)
                if key == ob_query_field and ob_query_skip:
                    result[key] = obsres
                else:
                    result[key] = req.query(dal, obsres, options=query_option)
            except NoResultFound as notfound:
                req.on_query_not_found(notfound)
        return self.create_input(**result)