def doi(self, doi: str) -> Self:
        """Search data granules by DOI.

        ???+ Tip
            Not all datasets have an associated DOI, internally if a DOI is found
            earthaccess will grab the concept_id for the query to CMR.

        Parameters:
            doi: DOI of a dataset, e.g. 10.5067/AQR50-3Q7CS

        Returns:
            self

        Raises:
            RuntimeError: The CMR query to get the collection for the DOI fails.
        """
        # TODO consider deferring this query until the search is executed
        collection = DataCollections().doi(doi).get()

        # TODO consider raising an exception when there are multiple collections, since
        # we can't know which one the user wants, and choosing one is arbitrary.
        if len(collection) > 0:
            concept_id = collection[0].concept_id()
            self.params["concept_id"] = concept_id
        else:
            # TODO consider removing this print statement since we don't print such
            # a message in other cases where no results are found.  Seems arbitrary.
            logger.info(
                f"earthaccess couldn't find any associated collections with the DOI: {doi}"
            )

        return self
Search data granules by DOI.

        ???+ Tip
            Not all datasets have an associated DOI, internally if a DOI is found
            earthaccess will grab the concept_id for the query to CMR.

        Parameters:
            doi: DOI of a dataset, e.g. 10.5067/AQR50-3Q7CS

        Returns:
            self

        Raises:
            RuntimeError: The CMR query to get the collection for the DOI fails.
        
earthaccess/search.py