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()

```

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)

{"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"}]}