prompt: We are currently solving the following issue within our repository. Here is the issue text:
  --- BEGIN ISSUE ---
  ATLAS forced photometry data processor should correctly interpret limiting data points.
  see [ATLAS Forced Photemetry Output Description](https://fallingstar-data.com/forcedphot/resultdesc/)
  for how to interpret data.
  
  --- END ISSUE ---
  
  Below are some code segments, each from a relevant file. One or more of these files may contain bugs.
  --- BEGIN FILES ---
  Path: `tom_dataproducts/processors/atlas_processor.py`
  Content:
  ```
  1 import mimetypes
  2 
  3 from astropy import units
  4 import astropy.io.ascii
  5 from astropy.time import Time, TimezoneInfo
  6 
  7 from tom_dataproducts.data_processor import DataProcessor
  8 from tom_dataproducts.exceptions import InvalidFileFormatException
  9 
  10 
  11 class AtlasProcessor(DataProcessor):
  12 
  13     def data_type_override(self):
  14         return 'photometry'
  15 
  16     def process_data(self, data_product):
  17         """
  18         Routes a atlas processing call to a method specific to a file-format.
  19 
  20         :param data_product: Photometric DataProduct which will be processed into the specified format for database
  21         ingestion
  22         :type data_product: DataProduct
  23 
  24         :returns: python list of 2-tuples, each with a timestamp and corresponding data
  25         :rtype: list
  26         """
  27 
  28         mimetype = mimetypes.guess_type(data_product.data.path)[0]
  29         if mimetype in self.PLAINTEXT_MIMETYPES:
  30             photometry = self._process_photometry_from_plaintext(data_product)
  31             return [(datum.pop('timestamp'), datum, datum.pop('source', 'ATLAS')) for datum in photometry]
  32         else:
  33             raise InvalidFileFormatException('Unsupported file type')
  34 
  35     def _process_photometry_from_plaintext(self, data_product):
  36         """
  37         Processes the photometric data from a plaintext file into a list of dicts. File is read using astropy as
  38         specified in the below documentation. The file is expected to be a multi-column delimited space delimited
  39         text file, as produced by the ATLAS forced photometry service at https://fallingstar-data.com/forcedphot
  40 
  41         The header looks like this:
  42         ###MJD   m   dm  uJy   duJy F err chi/N   RA  Dec   x   y  maj  min   phi  apfit mag5sig Sky   Obs
  43 
  44         :param data_product: ATLAS Photometric DataProduct which will be processed into a list of dicts
  45         :type data_product: DataProduct
  46 
  47         :returns: python list containing the photometric data from the DataProduct
  48         :rtype: list
  49         """
  50         photometry = []
  51 
  52         data = astropy.io.ascii.read(data_product.data.path)
  53         if len(data) < 1:
  54             raise InvalidFileFormatException('Empty table or invalid file type')
  55 
  56         try:
  57             for datum in data:
  58                 time = Time(float(datum['##MJD']), format='mjd')
  59                 utc = TimezoneInfo(utc_offset=0*units.hour)
  60                 time.format = 'datetime'
  61                 value = {
  62                     'timestamp': time.to_datetime(timezone=utc),
  63                     'magnitude': float(datum['m']),
  64                     'magnitude_error': float(datum['dm']),
  65                     'filter': str(datum['F'])
  66                 }
  67                 photometry.append(value)
  68         except Exception as e:
  69             raise InvalidFileFormatException(e)
  70 
  71         return photometry
  72
  ```
  --- END FILES ---
  
  Please first localize the bug based on the issue statement, and then generate a patch according to the `git diff` format fenced by three backticks.
  
  Here is an example:
  
  ```diff
  diff --git a/examples/server_async.py b/examples/server_async.py
  --- a/examples/server_async.py
  +++ b/examples/server_async.py
  @@ -313,4 +313,4 @@
   
   
   if __name__ == "__main__":
  -    asyncio.run(run_async_server("."), debug=True)
  +    asyncio.run(run_async_server(), debug=True)
  diff --git a/examples/server_sync.py b/examples/server_sync.py
  --- a/examples/server_sync.py
  +++ b/examples/server_sync.py
  @@ -313,5 +313,5 @@
   
   
   if __name__ == "__main__":
  -    server = run_sync_server(".")
  +    server = run_sync_server()
       server.shutdown()
  
  ```
  
golden_diff: diff --git a/tom_dataproducts/processors/atlas_processor.py b/tom_dataproducts/processors/atlas_processor.py
  --- a/tom_dataproducts/processors/atlas_processor.py
  +++ b/tom_dataproducts/processors/atlas_processor.py
  @@ -21,7 +21,7 @@
           ingestion
           :type data_product: DataProduct
   
  -        :returns: python list of 2-tuples, each with a timestamp and corresponding data
  +        :returns: python list of 3-tuples, each with a timestamp and corresponding data, and source
           :rtype: list
           """
   
  @@ -37,6 +37,7 @@
           Processes the photometric data from a plaintext file into a list of dicts. File is read using astropy as
           specified in the below documentation. The file is expected to be a multi-column delimited space delimited
           text file, as produced by the ATLAS forced photometry service at https://fallingstar-data.com/forcedphot
  +        See https://fallingstar-data.com/forcedphot/resultdesc/ for a description of the output format.
   
           The header looks like this:
           ###MJD   m   dm  uJy   duJy F err chi/N   RA  Dec   x   y  maj  min   phi  apfit mag5sig Sky   Obs
  @@ -48,6 +49,7 @@
           :rtype: list
           """
           photometry = []
  +        signal_to_noise_cutoff = 3.0  # cutoff to turn magnitudes into non-detection limits
   
           data = astropy.io.ascii.read(data_product.data.path)
           if len(data) < 1:
  @@ -60,10 +62,19 @@
                   time.format = 'datetime'
                   value = {
                       'timestamp': time.to_datetime(timezone=utc),
  -                    'magnitude': float(datum['m']),
  -                    'magnitude_error': float(datum['dm']),
  -                    'filter': str(datum['F'])
  +                    'filter': str(datum['F']),
  +                    'error': float(datum['dm']),
  +                    'telescope': 'ATLAS',
                   }
  +                # If the signal is in the noise, set the non-detection limit to the
  +                # absolute value of the reported magnitude.
  +                # see https://fallingstar-data.com/forcedphot/resultdesc/
  +                signal_to_noise = abs(float(datum['uJy']))/abs(float(datum['duJy']))
  +                if signal_to_noise <= signal_to_noise_cutoff:
  +                    value['limit'] = abs(float(datum['m']))
  +                else:
  +                    value['magnitude'] = abs(float(datum['m']))
  +
                   photometry.append(value)
           except Exception as e:
               raise InvalidFileFormatException(e)
  
verification_info: {"golden_diff": "diff --git a/tom_dataproducts/processors/atlas_processor.py b/tom_dataproducts/processors/atlas_processor.py\n--- a/tom_dataproducts/processors/atlas_processor.py\n+++ b/tom_dataproducts/processors/atlas_processor.py\n@@ -21,7 +21,7 @@\n         ingestion\n         :type data_product: DataProduct\n \n-        :returns: python list of 2-tuples, each with a timestamp and corresponding data\n+        :returns: python list of 3-tuples, each with a timestamp and corresponding data, and source\n         :rtype: list\n         \"\"\"\n \n@@ -37,6 +37,7 @@\n         Processes the photometric data from a plaintext file into a list of dicts. File is read using astropy as\n         specified in the below documentation. The file is expected to be a multi-column delimited space delimited\n         text file, as produced by the ATLAS forced photometry service at https://fallingstar-data.com/forcedphot\n+        See https://fallingstar-data.com/forcedphot/resultdesc/ for a description of the output format.\n \n         The header looks like this:\n         ###MJD   m   dm  uJy   duJy F err chi/N   RA  Dec   x   y  maj  min   phi  apfit mag5sig Sky   Obs\n@@ -48,6 +49,7 @@\n         :rtype: list\n         \"\"\"\n         photometry = []\n+        signal_to_noise_cutoff = 3.0  # cutoff to turn magnitudes into non-detection limits\n \n         data = astropy.io.ascii.read(data_product.data.path)\n         if len(data) < 1:\n@@ -60,10 +62,19 @@\n                 time.format = 'datetime'\n                 value = {\n                     'timestamp': time.to_datetime(timezone=utc),\n-                    'magnitude': float(datum['m']),\n-                    'magnitude_error': float(datum['dm']),\n-                    'filter': str(datum['F'])\n+                    'filter': str(datum['F']),\n+                    'error': float(datum['dm']),\n+                    'telescope': 'ATLAS',\n                 }\n+                # If the signal is in the noise, set the non-detection limit to the\n+                # absolute value of the reported magnitude.\n+                # see https://fallingstar-data.com/forcedphot/resultdesc/\n+                signal_to_noise = abs(float(datum['uJy']))/abs(float(datum['duJy']))\n+                if signal_to_noise <= signal_to_noise_cutoff:\n+                    value['limit'] = abs(float(datum['m']))\n+                else:\n+                    value['magnitude'] = abs(float(datum['m']))\n+\n                 photometry.append(value)\n         except Exception as e:\n             raise InvalidFileFormatException(e)\n", "issue": "ATLAS forced photometry data processor should correctly interpret limiting data points.\nsee [ATLAS Forced Photemetry Output Description](https://fallingstar-data.com/forcedphot/resultdesc/)\nfor how to interpret data.\n", "before_files": [{"content": "import mimetypes\n\nfrom astropy import units\nimport astropy.io.ascii\nfrom astropy.time import Time, TimezoneInfo\n\nfrom tom_dataproducts.data_processor import DataProcessor\nfrom tom_dataproducts.exceptions import InvalidFileFormatException\n\n\nclass AtlasProcessor(DataProcessor):\n\n    def data_type_override(self):\n        return 'photometry'\n\n    def process_data(self, data_product):\n        \"\"\"\n        Routes a atlas processing call to a method specific to a file-format.\n\n        :param data_product: Photometric DataProduct which will be processed into the specified format for database\n        ingestion\n        :type data_product: DataProduct\n\n        :returns: python list of 2-tuples, each with a timestamp and corresponding data\n        :rtype: list\n        \"\"\"\n\n        mimetype = mimetypes.guess_type(data_product.data.path)[0]\n        if mimetype in self.PLAINTEXT_MIMETYPES:\n            photometry = self._process_photometry_from_plaintext(data_product)\n            return [(datum.pop('timestamp'), datum, datum.pop('source', 'ATLAS')) for datum in photometry]\n        else:\n            raise InvalidFileFormatException('Unsupported file type')\n\n    def _process_photometry_from_plaintext(self, data_product):\n        \"\"\"\n        Processes the photometric data from a plaintext file into a list of dicts. File is read using astropy as\n        specified in the below documentation. The file is expected to be a multi-column delimited space delimited\n        text file, as produced by the ATLAS forced photometry service at https://fallingstar-data.com/forcedphot\n\n        The header looks like this:\n        ###MJD   m   dm  uJy   duJy F err chi/N   RA  Dec   x   y  maj  min   phi  apfit mag5sig Sky   Obs\n\n        :param data_product: ATLAS Photometric DataProduct which will be processed into a list of dicts\n        :type data_product: DataProduct\n\n        :returns: python list containing the photometric data from the DataProduct\n        :rtype: list\n        \"\"\"\n        photometry = []\n\n        data = astropy.io.ascii.read(data_product.data.path)\n        if len(data) < 1:\n            raise InvalidFileFormatException('Empty table or invalid file type')\n\n        try:\n            for datum in data:\n                time = Time(float(datum['##MJD']), format='mjd')\n                utc = TimezoneInfo(utc_offset=0*units.hour)\n                time.format = 'datetime'\n                value = {\n                    'timestamp': time.to_datetime(timezone=utc),\n                    'magnitude': float(datum['m']),\n                    'magnitude_error': float(datum['dm']),\n                    'filter': str(datum['F'])\n                }\n                photometry.append(value)\n        except Exception as e:\n            raise InvalidFileFormatException(e)\n\n        return photometry\n", "path": "tom_dataproducts/processors/atlas_processor.py"}], "after_files": [{"content": "import mimetypes\n\nfrom astropy import units\nimport astropy.io.ascii\nfrom astropy.time import Time, TimezoneInfo\n\nfrom tom_dataproducts.data_processor import DataProcessor\nfrom tom_dataproducts.exceptions import InvalidFileFormatException\n\n\nclass AtlasProcessor(DataProcessor):\n\n    def data_type_override(self):\n        return 'photometry'\n\n    def process_data(self, data_product):\n        \"\"\"\n        Routes a atlas processing call to a method specific to a file-format.\n\n        :param data_product: Photometric DataProduct which will be processed into the specified format for database\n        ingestion\n        :type data_product: DataProduct\n\n        :returns: python list of 3-tuples, each with a timestamp and corresponding data, and source\n        :rtype: list\n        \"\"\"\n\n        mimetype = mimetypes.guess_type(data_product.data.path)[0]\n        if mimetype in self.PLAINTEXT_MIMETYPES:\n            photometry = self._process_photometry_from_plaintext(data_product)\n            return [(datum.pop('timestamp'), datum, datum.pop('source', 'ATLAS')) for datum in photometry]\n        else:\n            raise InvalidFileFormatException('Unsupported file type')\n\n    def _process_photometry_from_plaintext(self, data_product):\n        \"\"\"\n        Processes the photometric data from a plaintext file into a list of dicts. File is read using astropy as\n        specified in the below documentation. The file is expected to be a multi-column delimited space delimited\n        text file, as produced by the ATLAS forced photometry service at https://fallingstar-data.com/forcedphot\n        See https://fallingstar-data.com/forcedphot/resultdesc/ for a description of the output format.\n\n        The header looks like this:\n        ###MJD   m   dm  uJy   duJy F err chi/N   RA  Dec   x   y  maj  min   phi  apfit mag5sig Sky   Obs\n\n        :param data_product: ATLAS Photometric DataProduct which will be processed into a list of dicts\n        :type data_product: DataProduct\n\n        :returns: python list containing the photometric data from the DataProduct\n        :rtype: list\n        \"\"\"\n        photometry = []\n        signal_to_noise_cutoff = 3.0  # cutoff to turn magnitudes into non-detection limits\n\n        data = astropy.io.ascii.read(data_product.data.path)\n        if len(data) < 1:\n            raise InvalidFileFormatException('Empty table or invalid file type')\n\n        try:\n            for datum in data:\n                time = Time(float(datum['##MJD']), format='mjd')\n                utc = TimezoneInfo(utc_offset=0*units.hour)\n                time.format = 'datetime'\n                value = {\n                    'timestamp': time.to_datetime(timezone=utc),\n                    'filter': str(datum['F']),\n                    'error': float(datum['dm']),\n                    'telescope': 'ATLAS',\n                }\n                # If the signal is in the noise, set the non-detection limit to the\n                # absolute value of the reported magnitude.\n                # see https://fallingstar-data.com/forcedphot/resultdesc/\n                signal_to_noise = abs(float(datum['uJy']))/abs(float(datum['duJy']))\n                if signal_to_noise <= signal_to_noise_cutoff:\n                    value['limit'] = abs(float(datum['m']))\n                else:\n                    value['magnitude'] = abs(float(datum['m']))\n\n                photometry.append(value)\n        except Exception as e:\n            raise InvalidFileFormatException(e)\n\n        return photometry\n", "path": "tom_dataproducts/processors/atlas_processor.py"}]}