Repository: nipy/nipype

Issue:
[BUG] TensorToMetrics inputs specification doesn't inherit from Mrtrix3 Base
### Summary
The TensorMetricsInputSpec doesn't inherit from MRTrix3BaseInputSpec, making some of the basic inputs unavailable for this class.

### Actual behavior
The specifications inherit from the CommandLineInputSpec.

### Expected behavior
Inheritance of the base MRTrix3BaseInputSpec specification.

 Platform details:

```
{'commit_hash': '33b1b6a3f',
 'commit_source': 'repository',
 'networkx_version': '3.3',
 'nibabel_version': '5.2.1',
 'nipype_version': '1.8.7.dev0',
 'numpy_version': '2.0.0',
 'pkg_path': '/home/galkepler/Projects/nipype/nipype',
 'scipy_version': '1.14.0',
 'sys_executable': '/home/galkepler/Projects/nipype/venv/bin/python',
 'sys_platform': 'linux',
 'sys_version': '3.11.8 | packaged by conda-forge | (main, Feb 16 2024, '
                '20:53:32) [GCC 12.3.0]',
 'traits_version': '6.3.2'}
```

### Execution environment

- My python environment outside container


Discussion:
codecov[bot]: ## [Codecov](https://app.codecov.io/gh/nipy/nipype/pull/3663?dropdown=coverage&src=pr&el=h1&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=nipy) Report
All modified and coverable lines are covered by tests :white_check_mark:
> Project coverage is 39.49%. Comparing base [(`4d1352a`)](https://app.codecov.io/gh/nipy/nipype/commit/4d1352ade7171fd5f55eff62cee4c99a4f9cfed1?dropdown=coverage&el=desc&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=nipy) to head [(`33b1b6a`)](https://app.codecov.io/gh/nipy/nipype/commit/33b1b6a3f74b7ea373018d3a427c4c0dc398038b?dropdown=coverage&el=desc&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=nipy).

> :exclamation:  There is a different number of reports uploaded between BASE (4d1352a) and HEAD (33b1b6a). Click for more details.
> 
> <details><summary>HEAD has 41 uploads less than BASE</summary>
>
>| Flag | BASE (4d1352a) | HEAD (33b1b6a) |
>|------|------|------|
>||45|4|
></details>

<details><summary>Additional details and impacted files</summary>


```diff
@@             Coverage Diff             @@
##           master    #3663       +/-   ##
===========================================
- Coverage   70.83%   39.49%   -31.34%     
===========================================
  Files        1276     1276               
  Lines       59314    59314               
  Branches     9824     9824               
===========================================
- Hits        42013    23427    -18586     
- Misses      16125    35729    +19604     
+ Partials     1176      158     -1018     
```

</details>

[:umbrella: View full report in Codecov by Sentry](https://app.codecov.io/gh/nipy/nipype/pull/3663?dropdown=coverage&src=pr&el=continue&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=nipy).   
:loudspeaker: Have feedback on the report? [Share it here](https://about.codecov.io/codecov-pr-comment-feedback/?utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=nipy).


Patch:
diff --git a/nipype/interfaces/mrtrix3/utils.py b/nipype/interfaces/mrtrix3/utils.py
index 8a69232ec..1a7c81dad 100644
--- a/nipype/interfaces/mrtrix3/utils.py
+++ b/nipype/interfaces/mrtrix3/utils.py
@@ -318,7 +318,7 @@ class Generate5tt(MRTrix3Base):
         return outputs
 
 
-class TensorMetricsInputSpec(CommandLineInputSpec):
+class TensorMetricsInputSpec(MRTrix3BaseInputSpec):
     in_file = File(
         exists=True,
         argstr="%s",


Test patch:
diff --git a/nipype/interfaces/mrtrix3/tests/test_auto_TensorMetrics.py b/nipype/interfaces/mrtrix3/tests/test_auto_TensorMetrics.py
index bbe12033c..28c33b079 100644
--- a/nipype/interfaces/mrtrix3/tests/test_auto_TensorMetrics.py
+++ b/nipype/interfaces/mrtrix3/tests/test_auto_TensorMetrics.py
@@ -7,6 +7,9 @@ def test_TensorMetrics_inputs():
         args=dict(
             argstr="%s",
         ),
+        bval_scale=dict(
+            argstr="-bvalue_scaling %s",
+        ),
         component=dict(
             argstr="-num %s",
             sep=",",
@@ -16,6 +19,22 @@ def test_TensorMetrics_inputs():
             nohash=True,
             usedefault=True,
         ),
+        grad_file=dict(
+            argstr="-grad %s",
+            extensions=None,
+            xor=["grad_fsl"],
+        ),
+        grad_fsl=dict(
+            argstr="-fslgrad %s %s",
+            xor=["grad_file"],
+        ),
+        in_bval=dict(
+            extensions=None,
+        ),
+        in_bvec=dict(
+            argstr="-fslgrad %s %s",
+            extensions=None,
+        ),
         in_file=dict(
             argstr="%s",
             extensions=None,
@@ -29,6 +48,10 @@ def test_TensorMetrics_inputs():
         modulate=dict(
             argstr="-modulate %s",
         ),
+        nthreads=dict(
+            argstr="-nthreads %d",
+            nohash=True,
+        ),
         out_ad=dict(
             argstr="-ad %s",
             extensions=None,
@@ -37,6 +60,13 @@ def test_TensorMetrics_inputs():
             argstr="-adc %s",
             extensions=None,
         ),
+        out_bval=dict(
+            extensions=None,
+        ),
+        out_bvec=dict(
+            argstr="-export_grad_fsl %s %s",
+            extensions=None,
+        ),
         out_cl=dict(
             argstr="-cl %s",
             extensions=None,