codecov[bot]: # [Codecov](https://codecov.io/gh/RadioAstronomySoftwareGroup/pyuvdata/pull/602?src=pr&el=h1) Report
> Merging [#602](https://codecov.io/gh/RadioAstronomySoftwareGroup/pyuvdata/pull/602?src=pr&el=desc) into [master](https://codecov.io/gh/RadioAstronomySoftwareGroup/pyuvdata/commit/ea29fd13d0a8eefb2c4f839e74e11f3636e09d4d?src=pr&el=desc) will **decrease** coverage by `<.01%`.
> The diff coverage is `100%`.

[![Impacted file tree graph](https://codecov.io/gh/RadioAstronomySoftwareGroup/pyuvdata/pull/602/graphs/tree.svg?width=650&token=4QykcCeB1H&height=150&src=pr)](https://codecov.io/gh/RadioAstronomySoftwareGroup/pyuvdata/pull/602?src=pr&el=tree)

```diff
@@            Coverage Diff             @@
##           master     #602      +/-   ##
==========================================
- Coverage   98.86%   98.86%   -0.01%     
==========================================
  Files          20       20              
  Lines        8012     8009       -3     
==========================================
- Hits         7921     7918       -3     
  Misses         91       91
```


| [Impacted Files](https://codecov.io/gh/RadioAstronomySoftwareGroup/pyuvdata/pull/602?src=pr&el=tree) | Coverage Δ | |
|---|---|---|
| [pyuvdata/uvflag.py](https://codecov.io/gh/RadioAstronomySoftwareGroup/pyuvdata/pull/602/diff?src=pr&el=tree#diff-cHl1dmRhdGEvdXZmbGFnLnB5) | `100% <100%> (ø)` | :arrow_up: |

------

[Continue to review full report at Codecov](https://codecov.io/gh/RadioAstronomySoftwareGroup/pyuvdata/pull/602?src=pr&el=continue).
> **Legend** - [Click here to learn more](https://docs.codecov.io/docs/codecov-delta)
> `Δ = absolute <relative> (impact)`, `ø = not affected`, `? = missing data`
> Powered by [Codecov](https://codecov.io/gh/RadioAstronomySoftwareGroup/pyuvdata/pull/602?src=pr&el=footer). Last update [ea29fd1...e1e023c](https://codecov.io/gh/RadioAstronomySoftwareGroup/pyuvdata/pull/602?src=pr&el=lastupdated). Read the [comment docs](https://docs.codecov.io/docs/pull-request-comments).

bhazelton: @adampbeardsley if you rebase this branch on master the tests should pass.
adampbeardsley: @mkolopanis I knocked off your comments. Ready for re-review.
adampbeardsley: Good call @mkolopanis - this was the whole reason I went down this rabbit hole last week, and I totally forgot about it by now.
diff --git a/CHANGELOG.md b/CHANGELOG.md
index e44f2896..f581386f 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -19,6 +19,7 @@ All notable changes to this project will be documented in this file.
 - `lst_array` is now saved to UVFITS files (even though it's not a standard parameter) so that it doesn't have to be recalculated
 
 ### Fixed
+- Fixed init logic in UVFlag.
 - Fixed a bug in how FHD uvw vectors were oriented (and visibilities were conjugated)
 - Fixed a bug in `UVData.inflate_by_redundancy` when Nblts is not equal to Nbls * Ntimes.
 - Fixed a bug in UVData when reading in an FHD file with a single time integration.
diff --git a/pyuvdata/uvflag.py b/pyuvdata/uvflag.py
index c22cd05b..38b523d4 100644
--- a/pyuvdata/uvflag.py
+++ b/pyuvdata/uvflag.py
@@ -16,26 +16,36 @@ from six.moves import map
 
 
 class UVFlag(object):
-    ''' Object to handle flag arrays and waterfalls. Supports reading/writing,
+    """ Object to handle flag arrays and waterfalls. Supports reading/writing,
     and stores all relevant information to combine flags and apply to data.
-    '''
+    """
 
     def __init__(self, input, mode='metric', copy_flags=False, waterfall=False, history='',
                  label=''):
-        '''Initialize UVFlag object.
-        Args:
-            input: UVData object, UVCal object, or path to previously saved UVFlag object.
-                   Can also be a list of any compatible combination of the above options.
-                   UVData and UVCal objects cannot be directly combined, unless waterfall is True.
-            mode: "metric" (default) or "flag" to initialize UVFlag in given mode.
-                  The mode determines whether the object has a floating point metric_array
-                  or a boolean flag_array.
-            copy_flags: Whether to copy flags from input to new UVFlag object. Default is False.
-            waterfall: Whether to immediately initialize as a waterfall object,
-                       with flag/metric axes: time, frequency, polarization. Default is False.
-            history: History string to attach to object.
-            label: string used for labeling the object (e.g. 'FM')
-        '''
+        """Initialize UVFlag object. Metadata is copied from input object. If input
+        is subclass of UVData or UVCal, the weights_array will be set to all ones.
+        Input lists or tuples are iterated through, treating each entry with an
+        individual UVFlag init.
+
+        Parameters
+        ----------
+        input : UVData or UVCal or str or list of compatible combination of options
+            Input to initialize UVFlag object. If str, assumed to be path to previously
+            saved UVFlag object. UVData and UVCal objects cannot be directly combined,
+            unless waterfall is True.
+        mode : {"metric", "flag"}, optional
+            The mode determines whether the object has a floating point metric_array
+            or a boolean flag_array. Default is "metric".
+        copy_flags : bool, optional
+            Whether to copy flags from input to new UVFlag object. Default is False.
+        waterfall : bool, optional
+            Whether to immediately initialize as a waterfall object, with flag/metric
+            axes: time, frequency, polarization. Default is False.
+        history : str, optional
+            History string to attach to object. Default is empty string.
+        label: str, optional
+            String used for labeling the object (e.g. 'FM'). Default is empty string.
+        """
 
         self.mode = mode.lower()  # Gets overwritten if reading file
         self.history = ''  # Added to at the end
@@ -45,13 +55,16 @@ class UVFlag(object):
             self.pyuvdata_version_str += ('  Git origin: ' + uvversion.git_origin
                                           + '.  Git hash: ' + uvversion.git_hash
                                           + '.  Git branch: ' + uvversion.git_branch
-                                          + '.  Git description: ' + uvversion.git_description + '.')
+                                          + '.  Git description: '
+                                          + uvversion.git_description + '.')
         self.label = ''  # Added to at the end
         if isinstance(input, (list, tuple)):
-            self.__init__(input[0], mode=mode, copy_flags=copy_flags, waterfall=waterfall, history=history)
+            self.__init__(input[0], mode=mode, copy_flags=copy_flags,
+                          waterfall=waterfall, history=history)
             if len(input) > 1:
                 for i in input[1:]:
-                    fobj = UVFlag(i, mode=mode, copy_flags=copy_flags, waterfall=waterfall, history=history)
+                    fobj = UVFlag(i, mode=mode, copy_flags=copy_flags,
+                                  waterfall=waterfall, history=history)
                     self += fobj
                 del(fobj)
 
@@ -60,7 +73,8 @@ class UVFlag(object):
             self.read(input, history)
         elif waterfall and issubclass(input.__class__, (UVData, UVCal)):
             self.type = 'waterfall'
-            self.history += 'Flag object with type "waterfall" created by ' + self.pyuvdata_version_str
+            self.history += ('Flag object with type "waterfall" created by '
+                             + self.pyuvdata_version_str)
             self.time_array, ri = np.unique(input.time_array, return_index=True)
             self.freq_array = input.freq_array[0, :]
             if issubclass(input.__class__, UVData):
@@ -70,11 +84,8 @@ class UVFlag(object):
                 self.polarization_array = input.jones_array
                 self.lst_array = lst_from_uv(input)[ri]
             if copy_flags:
-                self.metric_array = flags2waterfall(input, keep_pol=True)
-                self.history += ' Waterfall generated from ' + str(input.__class__) + ' object.'
-                if self.mode == 'flag':
-                    warnings.warn('Copying flags into waterfall results in mode=="metric".')
-                    self.mode = 'metric'
+                raise NotImplementedError('Cannot copy flags when initializing '
+                                          ' waterfall UVFlag from UVData or UVCal.')
             else:
                 if self.mode == 'flag':
                     self.flag_array = np.zeros((len(self.time_array),
@@ -87,7 +98,8 @@ class UVFlag(object):
 
         elif issubclass(input.__class__, UVData):
             self.type = 'baseline'
-            self.history += 'Flag object with type "baseline" created by ' + self.pyuvdata_version_str
+            self.history += ('Flag object with type "baseline" created by '
+                             + self.pyuvdata_version_str)
             self.baseline_array = input.baseline_array
             self.ant_1_array = input.ant_1_array
             self.ant_2_array = input.ant_2_array
@@ -110,7 +122,8 @@ class UVFlag(object):
 
         elif issubclass(input.__class__, UVCal):
             self.type = 'antenna'
-            self.history += 'Flag object with type "antenna" created by ' + self.pyuvdata_version_str
+            self.history += ('Flag object with type "antenna" created by '
+                             + self.pyuvdata_version_str)
             self.ant_array = input.ant_array
             self.time_array = input.time_array
             self.lst_array = lst_from_uv(input)
@@ -127,8 +140,11 @@ class UVFlag(object):
                     self.flag_array = np.zeros_like(input.flag_array)
                 elif self.mode == 'metric':
                     self.metric_array = np.zeros_like(input.flag_array).astype(np.float)
+        else:
+            raise ValueError('input to UVFlag.__init__ must be one of: list, tuple, '
+                             'string, UVData, or UVCal.')
 
-        if not isinstance(input, str):
+        if issubclass(input.__class__, (UVData, UVCal)):
             if self.mode == 'flag':
                 self.weights_array = np.ones(self.flag_array.shape)
             else:
@@ -203,7 +219,8 @@ class UVFlag(object):
                 self.time_array = header['time_array'][()]
                 self.lst_array = header['lst_array'][()]
                 self.freq_array = header['freq_array'][()]
-                self.history = uvutils._bytes_to_str(header['history'][()]) + ' Read by ' + self.pyuvdata_version_str
+                self.history = (uvutils._bytes_to_str(header['history'][()])
+                                + ' Read by ' + self.pyuvdata_version_str)
                 self.history += history
                 if 'label' in header.keys():
                     self.label = uvutils._bytes_to_str(header['label'][()])
@@ -259,7 +276,8 @@ class UVFlag(object):
             header['lst_array'] = self.lst_array
             header['freq_array'] = self.freq_array
             header['polarization_array'] = self.polarization_array
-            header['history'] = uvutils._str_to_bytes(self.history + 'Written by ' + self.pyuvdata_version_str)
+            header['history'] = uvutils._str_to_bytes(self.history + 'Written by '
+                                                      + self.pyuvdata_version_str)
             header['label'] = uvutils._str_to_bytes(self.label)
 
             if self.type == 'baseline':
@@ -284,12 +302,12 @@ class UVFlag(object):
                                            compression=data_compression)
 
     def __add__(self, other, inplace=False, axis='time'):
-        '''Add two UVFlag objects together along a given axis.
+        """Add two UVFlag objects together along a given axis.
         Args:
             other: second UVFlag object to concatenate with self.
             inplace: Whether to concatenate to self, or create a new UVFlag object. Default is False.
             axis: Axis along which to combine UVFlag objects. Default is time.
-        '''
+        """
 
         # Handle in place
         if inplace:
@@ -367,11 +385,11 @@ class UVFlag(object):
         return self
 
     def __or__(self, other, inplace=False):
-        '''Combine two UVFlag objects in "flag" mode by "OR"-ing their flags.
+        """Combine two UVFlag objects in "flag" mode by "OR"-ing their flags.
         Args:
             other: second UVFlag object to combine with self.
             inplace: Whether to combine to self, or create a new UVFlag object. Default is False.
-        '''
+        """
         if (self.mode != 'flag') or (other.mode != 'flag'):
             raise ValueError('UVFlag object must be in "flag" mode to use "or" function.')
 
@@ -388,10 +406,10 @@ class UVFlag(object):
             return this
 
     def __ior__(self, other):
-        '''In place or
+        """In place or
         Args:
             other: second UVFlag object to combine with self.
-        '''
+        """
         self.__or__(other, inplace=True)
         return self
 
@@ -415,7 +433,7 @@ class UVFlag(object):
             del(self.flag_array)
 
     def copy(self):
-        ''' Simply return a copy of this object '''
+        """ Simply return a copy of this object """
         return copy.deepcopy(self)
 
     def combine_metrics(self, others, method='quadmean', inplace=True):
@@ -473,7 +491,8 @@ class UVFlag(object):
             darr = self.metric_array
         if len(self.polarization_array) > 1:
             # Collapse pol dimension. But note we retain a polarization axis.
-            d, w = uvutils.collapse(darr, method, axis=-1, weights=self.weights_array, return_weights=True)
+            d, w = uvutils.collapse(darr, method, axis=-1, weights=self.weights_array,
+                                    return_weights=True)
             darr = np.expand_dims(d, axis=d.ndim)
             self.weights_array = np.expand_dims(w, axis=w.ndim)
             self.polarization_array = np.array([','.join(map(str, self.polarization_array))],
@@ -546,7 +565,7 @@ class UVFlag(object):
         self.clear_unused_attributes()
 
     def to_baseline(self, uv, force_pol=False):
-        '''Convert a UVFlag object of type "waterfall" to type "baseline".
+        """Convert a UVFlag object of type "waterfall" to type "baseline".
         Broadcasts the flag array to all baselines.
         This function does NOT apply flags to uv.
         Args:
@@ -555,7 +574,7 @@ class UVFlag(object):
                        Otherwise, will require polarizations match.
                        For example, this keyword is useful if one flags on all
                        pols combined, and wants to broadcast back to individual pols.
-        '''
+        """
         if self.type == 'baseline':
             return
         if not (issubclass(uv.__class__, UVData) or (isinstance(uv, UVFlag) and uv.type == 'baseline')):
@@ -608,7 +627,7 @@ class UVFlag(object):
         self.history += 'Broadcast to type "baseline" with ' + self.pyuvdata_version_str
 
     def to_antenna(self, uv, force_pol=False):
-        '''Convert a UVFlag object of type "waterfall" to type "antenna".
+        """Convert a UVFlag object of type "waterfall" to type "antenna".
         Broadcasts the flag array to all antennas.
         This function does NOT apply flags to uv.
         Args:
@@ -617,7 +636,7 @@ class UVFlag(object):
                        Otherwise, will require polarizations match.
                        For example, this keyword is useful if one flags on all
                        pols combined, and wants to broadcast back to individual pols.
-        '''
+        """
         if self.type == 'antenna':
             return
         if not (issubclass(uv.__class__, UVCal) or (isinstance(uv, UVFlag) and uv.type == 'antenna')):
@@ -663,13 +682,13 @@ class UVFlag(object):
         self.history += 'Broadcast to type "antenna" with ' + self.pyuvdata_version_str
 
     def to_flag(self, threshold=np.inf):
-        '''Convert to flag mode. NOT SMART. Removes metric_array and creates a
+        """Convert to flag mode. NOT SMART. Removes metric_array and creates a
         flag_array from a simple threshold on the metric values.
 
         Args:
             threshold (float): Metric value over which the corresponding flag is
                 set to True. Default is np.inf, which results in flags of all False.
-        '''
+        """
         if self.mode == 'flag':
             return
         elif self.mode == 'metric':
@@ -683,7 +702,7 @@ class UVFlag(object):
         self.clear_unused_attributes()
 
     def to_metric(self, convert_wgts=False):
-        '''Convert to metric mode. NOT SMART. Simply recasts flag_array as float
+        """Convert to metric mode. NOT SMART. Simply recasts flag_array as float
         and uses this as the metric array.
 
         Args:
@@ -693,7 +712,7 @@ class UVFlag(object):
                 flags as metrics to calculate flag fraction. Zero weighting
                 completely flagged rows/columns prevents those from counting
                 against a threshold along the other dimension.
-        '''
+        """
         if self.mode == 'metric':
             return
         elif self.mode == 'flag':
@@ -816,13 +835,13 @@ def and_rows_cols(waterfall):
 
 
 def lst_from_uv(uv):
-    ''' Calculate the lst_array for a UVData or UVCal object.
+    """ Calculate the lst_array for a UVData or UVCal object.
     Args:
         uv: a UVData or UVCal object.
     Returns:
         lst_array: lst_array corresponding to time_array and at telescope location.
                    Units are radian.
-    '''
+    """
     if not isinstance(uv, (UVCal, UVData)):
         raise ValueError('Function lst_from_uv can only operate on '
                          'UVCal or UVData object.')

Resolve init logic in uvflag
There is an outstanding issue in hera_qm to figure out the init logic in uvflag, and be sure the weights array ends up the way one would expect. Since we have moved uvflag over to pyuvdata, we need to move the issue too.

HERA-Team/hera_qm#264
diff --git a/pyuvdata/tests/test_uvflag.py b/pyuvdata/tests/test_uvflag.py
index c5baee21..4418cf39 100644
--- a/pyuvdata/tests/test_uvflag.py
+++ b/pyuvdata/tests/test_uvflag.py
@@ -169,18 +169,33 @@ def test_init_waterfall_flag():
 def test_init_waterfall_copy_flags():
     uv = UVCal()
     uv.read_calfits(test_c_file)
-    uvf = uvtest.checkWarnings(UVFlag, [uv], {'copy_flags': True, 'mode': 'flag', 'waterfall': True},
-                               nwarnings=1, message='Copying flags into waterfall')
-    assert not hasattr(uvf, 'flag_array')  # Should be metric due to copy flags
-    assert uvf.metric_array.shape == (uv.Ntimes, uv.Nfreqs, uv.Njones)
-    assert uvf.weights_array.shape == (uv.Ntimes, uv.Nfreqs, uv.Njones)
-    assert uvf.type == 'waterfall'
-    assert uvf.mode == 'metric'
-    assert np.all(uvf.time_array == np.unique(uv.time_array))
-    assert np.all(uvf.freq_array == uv.freq_array[0])
-    assert np.all(uvf.polarization_array == uv.jones_array)
-    assert 'Flag object with type "waterfall"' in uvf.history
-    assert pyuvdata_version_str in uvf.history
+    pytest.raises(NotImplementedError, UVFlag, uv, copy_flags=True, mode='flag',
+                  waterfall=True)
+
+
+def test_init_invalid_input():
+    # input is not UVData, UVCal, path, or list/tuple
+    with pytest.raises(ValueError) as cm:
+        foo = UVFlag(14)
+    assert str(cm.value).startswith('input to UVFlag.__init__ must be one of:')
+
+
+@uvtest.skipIf_no_h5py
+def test_init_list_files_weights(tmpdir):
+    # Test that weights are preserved when reading list of files
+    tmp_path = tmpdir.strpath
+    # Create two files to read
+    uvf = UVFlag(test_f_file)
+    np.random.seed(0)
+    wts1 = np.random.rand(*uvf.weights_array.shape)
+    uvf.weights_array = wts1.copy()
+    uvf.write(os.path.join(tmp_path, 'test1.h5'))
+    wts2 = np.random.rand(*uvf.weights_array.shape)
+    uvf.weights_array = wts2.copy()
+    uvf.write(os.path.join(tmp_path, 'test2.h5'))
+    uvf2 = UVFlag([os.path.join(tmp_path, 'test1.h5'),
+                   os.path.join(tmp_path, 'test2.h5')])
+    assert np.all(uvf2.weights_array == np.concatenate([wts1, wts2], axis=0))
 
 
 @uvtest.skipIf_no_h5py

ci/pyuvdata_tests.yml
pip install -e .[dev]
parse_log_pytest
environment.yml
pytest coverage pytest-cov
apt-get update apt-get install -y gcc g++
3.9
pytest --no-header -rA --tb=line --color=no -p no:cacheprovider -W ignore::DeprecationWarning
astropy @ file:///home/conda/feedstock_root/build_artifacts/astropy_1711552966528/work
astropy-iers-data @ file:///home/conda/feedstock_root/build_artifacts/astropy-iers-data_1743404247859/work
cached-property @ file:///home/conda/feedstock_root/build_artifacts/cached_property_1615209429212/work
certifi @ file:///home/conda/feedstock_root/build_artifacts/certifi_1739515848642/work/certifi
colorama @ file:///home/conda/feedstock_root/build_artifacts/colorama_1733218098505/work
contourpy @ file:///home/conda/feedstock_root/build_artifacts/contourpy_1727293517607/work
coverage @ file:///home/conda/feedstock_root/build_artifacts/coverage_1743381224823/work
cycler @ file:///home/conda/feedstock_root/build_artifacts/cycler_1733332471406/work
exceptiongroup @ file:///home/conda/feedstock_root/build_artifacts/exceptiongroup_1733208806608/work
fonttools @ file:///home/conda/feedstock_root/build_artifacts/fonttools_1738940303262/work
h5py @ file:///home/conda/feedstock_root/build_artifacts/h5py_1739952287730/work
healpy @ file:///home/conda/feedstock_root/build_artifacts/healpy_1726188845854/work
importlib_metadata @ file:///home/conda/feedstock_root/build_artifacts/importlib-metadata_1737420181517/work
importlib_resources @ file:///home/conda/feedstock_root/build_artifacts/importlib_resources_1736252299705/work
iniconfig @ file:///home/conda/feedstock_root/build_artifacts/iniconfig_1733223141826/work
kiwisolver @ file:///home/conda/feedstock_root/build_artifacts/kiwisolver_1725459266648/work
matplotlib==3.9.4
munkres==1.1.4
numpy @ file:///home/conda/feedstock_root/build_artifacts/numpy_1707225342954/work/dist/numpy-1.26.4-cp39-cp39-linux_x86_64.whl#sha256=c799942b5898f6e6c60264d1663a6469a475290e758c654aeeb78e2596463abd
packaging @ file:///home/conda/feedstock_root/build_artifacts/packaging_1733203243479/work
pillow @ file:///home/conda/feedstock_root/build_artifacts/pillow_1735929703139/work
pluggy @ file:///home/conda/feedstock_root/build_artifacts/pluggy_1733222765875/work
pyerfa @ file:///home/conda/feedstock_root/build_artifacts/pyerfa_1731377659516/work
pyparsing @ file:///home/conda/feedstock_root/build_artifacts/pyparsing_1743089729650/work
pytest @ file:///home/conda/feedstock_root/build_artifacts/pytest_1740946542080/work
pytest-cov @ file:///home/conda/feedstock_root/build_artifacts/pytest-cov_1733223023082/work
python-casacore @ file:///home/conda/feedstock_root/build_artifacts/python-casacore_1727801082492/work
python-dateutil @ file:///home/conda/feedstock_root/build_artifacts/python-dateutil_1733215673016/work
-e git+https://github.com/RadioAstronomySoftwareGroup/pyuvdata.git@dfb3a212f87cbf3fdb4dd82728a1326b4eb7c107#egg=pyuvdata
PyYAML @ file:///home/conda/feedstock_root/build_artifacts/pyyaml_1737454647378/work
scipy @ file:///home/conda/feedstock_root/build_artifacts/scipy-split_1716470218293/work/dist/scipy-1.13.1-cp39-cp39-linux_x86_64.whl#sha256=e6696cb8683d94467891b7648e068a3970f6bc0a1b3c1aa7f9bc89458eafd2f0
six @ file:///home/conda/feedstock_root/build_artifacts/six_1733380938961/work
toml @ file:///home/conda/feedstock_root/build_artifacts/toml_1734091811753/work
tomli @ file:///home/conda/feedstock_root/build_artifacts/tomli_1733256695513/work
unicodedata2 @ file:///home/conda/feedstock_root/build_artifacts/unicodedata2_1736692503055/work
zipp @ file:///home/conda/feedstock_root/build_artifacts/zipp_1732827521216/work

name: pyuvdata
channels:
  - https://repo.anaconda.com/pkgs/main
  - https://repo.anaconda.com/pkgs/r
  - conda-forge
dependencies:
  - _libgcc_mutex=0.1=conda_forge
  - _openmp_mutex=4.5=2_gnu
  - astropy=6.0.1=py39h44dd56e_0
  - astropy-iers-data=0.2025.3.31.0.36.18=pyhd8ed1ab_0
  - brotli=1.1.0=hb9d3cd8_2
  - brotli-bin=1.1.0=hb9d3cd8_2
  - bzip2=1.0.8=h4bc722e_7
  - c-ares=1.34.4=hb9d3cd8_0
  - ca-certificates=2025.1.31=hbcca054_0
  - cached-property=1.5.2=hd8ed1ab_1
  - cached_property=1.5.2=pyha770c72_1
  - casacore=3.6.1=nompi_py39h0818cae_103
  - certifi=2025.1.31=pyhd8ed1ab_0
  - cfitsio=4.4.1=ha728647_2
  - colorama=0.4.6=pyhd8ed1ab_1
  - contourpy=1.3.0=py39h74842e3_2
  - coverage=7.8.0=py39h9399b63_0
  - cycler=0.12.1=pyhd8ed1ab_1
  - exceptiongroup=1.2.2=pyhd8ed1ab_1
  - fftw=3.3.10=nompi_hf1063bd_110
  - fonttools=4.56.0=py39h9399b63_0
  - freetype=2.13.3=h48d6fc4_0
  - gsl=2.7=he838d99_0
  - h5py=3.13.0=nompi_py39h30a5a8d_100
  - hdf5=1.14.3=nompi_h2d575fe_109
  - healpy=1.17.3=py39h5aaeee2_2
  - importlib-metadata=8.6.1=pyha770c72_0
  - importlib-resources=6.5.2=pyhd8ed1ab_0
  - importlib_resources=6.5.2=pyhd8ed1ab_0
  - iniconfig=2.0.0=pyhd8ed1ab_1
  - keyutils=1.6.1=h166bdaf_0
  - kiwisolver=1.4.7=py39h74842e3_0
  - krb5=1.21.3=h659f571_0
  - lcms2=2.17=h717163a_0
  - ld_impl_linux-64=2.43=h712a8e2_4
  - lerc=4.0.0=h27087fc_0
  - libaec=1.1.3=h59595ed_0
  - libblas=3.9.0=31_h59b9bed_openblas
  - libboost-python=1.86.0=py39hf59e57a_3
  - libbrotlicommon=1.1.0=hb9d3cd8_2
  - libbrotlidec=1.1.0=hb9d3cd8_2
  - libbrotlienc=1.1.0=hb9d3cd8_2
  - libcblas=3.9.0=31_he106b2a_openblas
  - libcurl=8.12.1=h332b0f4_0
  - libdeflate=1.23=h4ddbbb0_0
  - libedit=3.1.20250104=pl5321h7949ede_0
  - libev=4.33=hd590300_2
  - libffi=3.4.6=h2dba641_0
  - libgcc=14.2.0=h767d61c_2
  - libgcc-ng=14.2.0=h69a702a_2
  - libgfortran=14.2.0=h69a702a_2
  - libgfortran-ng=14.2.0=h69a702a_2
  - libgfortran5=14.2.0=hf1ad2bd_2
  - libgomp=14.2.0=h767d61c_2
  - libjpeg-turbo=3.0.0=hd590300_1
  - liblapack=3.9.0=31_h7ac8fdf_openblas
  - liblzma=5.6.4=hb9d3cd8_0
  - libnghttp2=1.64.0=h161d5f1_0
  - libnsl=2.0.1=hd590300_0
  - libopenblas=0.3.29=pthreads_h94d23a6_0
  - libpng=1.6.47=h943b412_0
  - libsqlite=3.49.1=hee588c1_2
  - libssh2=1.11.1=hf672d98_0
  - libstdcxx=14.2.0=h8f9b012_2
  - libstdcxx-ng=14.2.0=h4852527_2
  - libtiff=4.7.0=hd9ff511_3
  - libuuid=2.38.1=h0b41bf4_0
  - libwebp-base=1.5.0=h851e524_0
  - libxcb=1.17.0=h8a09558_0
  - libxcrypt=4.4.36=hd590300_1
  - libzlib=1.3.1=hb9d3cd8_2
  - matplotlib-base=3.9.4=py39h16632d1_0
  - munkres=1.1.4=pyh9f0ad1d_0
  - ncurses=6.5=h2d0b736_3
  - numpy=1.26.4=py39h474f0d3_0
  - openjpeg=2.5.3=h5fbd93e_0
  - openssl=3.4.1=h7b32b05_0
  - packaging=24.2=pyhd8ed1ab_2
  - pgplot=5.2.2=hbeaba86_1009
  - pillow=11.1.0=py39h15c0740_0
  - pip=25.0.1=pyh8b19718_0
  - pluggy=1.5.0=pyhd8ed1ab_1
  - pthread-stubs=0.4=hb9d3cd8_1002
  - pyerfa=2.0.1.5=py39hf3d9206_0
  - pyparsing=3.2.3=pyhd8ed1ab_1
  - pytest=8.3.5=pyhd8ed1ab_0
  - pytest-cov=6.0.0=pyhd8ed1ab_1
  - python=3.9.21=h9c0c6dc_1_cpython
  - python-casacore=3.6.1=py39h062b40a_1
  - python-dateutil=2.9.0.post0=pyhff2d567_1
  - python_abi=3.9=5_cp39
  - pyyaml=6.0.2=py39h9399b63_2
  - qhull=2020.2=h434a139_5
  - readline=8.2=h8c095d6_2
  - scipy=1.13.1=py39haf93ffa_0
  - setuptools=75.8.2=pyhff2d567_0
  - six=1.17.0=pyhd8ed1ab_0
  - tk=8.6.13=noxft_h4845f30_101
  - toml=0.10.2=pyhd8ed1ab_1
  - tomli=2.2.1=pyhd8ed1ab_1
  - tzdata=2025b=h78e105d_0
  - unicodedata2=16.0.0=py39h8cd3c5a_0
  - wcslib=8.2.2=ha708777_2
  - wheel=0.45.1=pyhd8ed1ab_1
  - xorg-libx11=1.8.12=h4f16b4b_0
  - xorg-libxau=1.0.12=hb9d3cd8_0
  - xorg-libxdmcp=1.1.5=hb9d3cd8_0
  - yaml=0.2.5=h7f98852_2
  - zipp=3.21.0=pyhd8ed1ab_1
  - zlib=1.3.1=hb9d3cd8_2
  - zstd=1.5.7=hb8e6e7a_2
prefix: /opt/conda/envs/pyuvdata

pyuvdata/tests/test_uvflag.py::test_init_invalid_input pyuvdata/tests/test_uvflag.py::test_init_list_files_weights
pyuvdata/tests/test_uvflag.py::test_init_UVData pyuvdata/tests/test_uvflag.py::test_init_UVData_copy_flags pyuvdata/tests/test_uvflag.py::test_init_UVCal pyuvdata/tests/test_uvflag.py::test_init_cal_copy_flags pyuvdata/tests/test_uvflag.py::test_init_waterfall_uvd pyuvdata/tests/test_uvflag.py::test_init_waterfall_uvc pyuvdata/tests/test_uvflag.py::test_init_waterfall_flag pyuvdata/tests/test_uvflag.py::test_init_waterfall_copy_flags pyuvdata/tests/test_uvflag.py::test_read_write_loop pyuvdata/tests/test_uvflag.py::test_read_write_ant pyuvdata/tests/test_uvflag.py::test_read_write_nocompress pyuvdata/tests/test_uvflag.py::test_read_write_nocompress_flag pyuvdata/tests/test_uvflag.py::test_init_list pyuvdata/tests/test_uvflag.py::test_read_list pyuvdata/tests/test_uvflag.py::test_read_change_type pyuvdata/tests/test_uvflag.py::test_read_change_mode pyuvdata/tests/test_uvflag.py::test_lst_from_uv pyuvdata/tests/test_uvflag.py::test_add_antenna pyuvdata/tests/test_uvflag.py::test_add_flag pyuvdata/tests/test_uvflag.py::test_add_errors pyuvdata/tests/test_uvflag.py::test_collapse_pol_or pyuvdata/tests/test_uvflag.py::test_collapse_pol_flag pyuvdata/tests/test_uvflag.py::test_to_waterfall_bl_flags pyuvdata/tests/test_uvflag.py::test_to_waterfall_bl_flags_or pyuvdata/tests/test_uvflag.py::test_to_waterfall_ant pyuvdata/tests/test_uvflag.py::test_to_baseline_flags pyuvdata/tests/test_uvflag.py::test_to_baseline_metric pyuvdata/tests/test_uvflag.py::test_baseline_to_baseline pyuvdata/tests/test_uvflag.py::test_to_baseline_errors pyuvdata/tests/test_uvflag.py::test_to_baseline_force_pol pyuvdata/tests/test_uvflag.py::test_to_baseline_metric_force_pol pyuvdata/tests/test_uvflag.py::test_to_antenna_flags pyuvdata/tests/test_uvflag.py::test_to_antenna_metric pyuvdata/tests/test_uvflag.py::test_to_antenna_flags_match_uvflag pyuvdata/tests/test_uvflag.py::test_antenna_to_antenna pyuvdata/tests/test_uvflag.py::test_to_antenna_errors pyuvdata/tests/test_uvflag.py::test_to_antenna_force_pol pyuvdata/tests/test_uvflag.py::test_to_antenna_metric_force_pol pyuvdata/tests/test_uvflag.py::test_or pyuvdata/tests/test_uvflag.py::test_or_error pyuvdata/tests/test_uvflag.py::test_or_add_history pyuvdata/tests/test_uvflag.py::test_ior pyuvdata/tests/test_uvflag.py::test_to_flag pyuvdata/tests/test_uvflag.py::test_to_flag_threshold pyuvdata/tests/test_uvflag.py::test_flag_to_flag pyuvdata/tests/test_uvflag.py::test_to_metric_baseline pyuvdata/tests/test_uvflag.py::test_to_metric_waterfall pyuvdata/tests/test_uvflag.py::test_to_metric_antenna pyuvdata/tests/test_uvflag.py::test_combine_metrics_inplace pyuvdata/tests/test_uvflag.py::test_combine_metrics_not_inplace pyuvdata/tests/test_uvflag.py::test_combine_metrics_not_uvflag pyuvdata/tests/test_uvflag.py::test_combine_metrics_not_metric pyuvdata/tests/test_uvflag.py::test_combine_metrics_wrong_shape pyuvdata/tests/test_uvflag.py::test_super pyuvdata/tests/test_uvflag.py::test_flags2waterfall pyuvdata/tests/test_uvflag.py::test_flags2waterfall_errors pyuvdata/tests/test_uvflag.py::test_and_rows_cols
pyuvdata/tests/test_uvflag.py::test_read_error pyuvdata/tests/test_uvflag.py::test_write_no_clobber pyuvdata/tests/test_uvflag.py::test_lst_from_uv_error pyuvdata/tests/test_uvflag.py::test_add pyuvdata/tests/test_uvflag.py::test_add_baseline pyuvdata/tests/test_uvflag.py::test_add_frequency pyuvdata/tests/test_uvflag.py::test_add_pol pyuvdata/tests/test_uvflag.py::test_inplace_add pyuvdata/tests/test_uvflag.py::test_clear_unused_attributes pyuvdata/tests/test_uvflag.py::test_not_equal pyuvdata/tests/test_uvflag.py::test_to_waterfall_bl pyuvdata/tests/test_uvflag.py::test_to_waterfall_bl_multi_pol pyuvdata/tests/test_uvflag.py::test_collapse_pol pyuvdata/tests/test_uvflag.py::test_collapse_single_pol pyuvdata/tests/test_uvflag.py::test_to_waterfall_waterfall pyuvdata/tests/test_uvflag.py::test_copy pyuvdata/tests/test_uvflag.py::test_to_flag_unknown_mode pyuvdata/tests/test_uvflag.py::test_metric_to_metric pyuvdata/tests/test_uvflag.py::test_to_metric_unknown_mode pyuvdata/tests/test_uvflag.py::test_antpair2ind pyuvdata/tests/test_uvflag.py::test_antpair2ind_nonbaseline pyuvdata/tests/test_uvflag.py::test_baseline_to_antnums pyuvdata/tests/test_uvflag.py::test_get_baseline_nums pyuvdata/tests/test_uvflag.py::test_get_antpairs pyuvdata/tests/test_uvflag.py::test_missing_Nants_telescope
pyuvdata/uvflag.py CHANGELOG.md
pyuvdata/uvflag.py CHANGELOG.md