annotate rename_tiff_channels.xml @ 4:55bc102d7709 draft

planemo upload for repository https://github.com/goeckslab/tools-mti/tree/main/tools/mti-utils commit 5cf3005f482381216061eb8718aba8f5c8bcb0d5
author goeckslab
date Fri, 10 May 2024 21:01:32 +0000
parents d2c59a1ac0c4
children 61fd94c7ce42
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
2
d2c59a1ac0c4 planemo upload for repository https://github.com/goeckslab/tools-mti/tree/main/tools/mti-utils commit 130ef7e8ae6cab35866b72617e53d35acc11475a
goeckslab
parents: 0
diff changeset
1 <tool id="rename_tiff_channels" name="Rename OME-TIFF channels" version="@TOOL_VERSION@+galaxy@VERSION_SUFFIX@" profile="@PROFILE@">
d2c59a1ac0c4 planemo upload for repository https://github.com/goeckslab/tools-mti/tree/main/tools/mti-utils commit 130ef7e8ae6cab35866b72617e53d35acc11475a
goeckslab
parents: 0
diff changeset
2 <description>with ome-types</description>
0
18f6be63414c planemo upload for repository https://github.com/goeckslab/tools-mti/tree/main/tools/mti-utils commit 339f5497446066ca76c27460da2eef4f6e0fa36e
goeckslab
parents:
diff changeset
3 <macros>
18f6be63414c planemo upload for repository https://github.com/goeckslab/tools-mti/tree/main/tools/mti-utils commit 339f5497446066ca76c27460da2eef4f6e0fa36e
goeckslab
parents:
diff changeset
4 <import>macros.xml</import>
18f6be63414c planemo upload for repository https://github.com/goeckslab/tools-mti/tree/main/tools/mti-utils commit 339f5497446066ca76c27460da2eef4f6e0fa36e
goeckslab
parents:
diff changeset
5 </macros>
2
d2c59a1ac0c4 planemo upload for repository https://github.com/goeckslab/tools-mti/tree/main/tools/mti-utils commit 130ef7e8ae6cab35866b72617e53d35acc11475a
goeckslab
parents: 0
diff changeset
6
d2c59a1ac0c4 planemo upload for repository https://github.com/goeckslab/tools-mti/tree/main/tools/mti-utils commit 130ef7e8ae6cab35866b72617e53d35acc11475a
goeckslab
parents: 0
diff changeset
7 <edam_operations>
d2c59a1ac0c4 planemo upload for repository https://github.com/goeckslab/tools-mti/tree/main/tools/mti-utils commit 130ef7e8ae6cab35866b72617e53d35acc11475a
goeckslab
parents: 0
diff changeset
8 <edam_operation>operation_3443</edam_operation>
d2c59a1ac0c4 planemo upload for repository https://github.com/goeckslab/tools-mti/tree/main/tools/mti-utils commit 130ef7e8ae6cab35866b72617e53d35acc11475a
goeckslab
parents: 0
diff changeset
9 </edam_operations>
d2c59a1ac0c4 planemo upload for repository https://github.com/goeckslab/tools-mti/tree/main/tools/mti-utils commit 130ef7e8ae6cab35866b72617e53d35acc11475a
goeckslab
parents: 0
diff changeset
10
0
18f6be63414c planemo upload for repository https://github.com/goeckslab/tools-mti/tree/main/tools/mti-utils commit 339f5497446066ca76c27460da2eef4f6e0fa36e
goeckslab
parents:
diff changeset
11 <expand macro="requirements"/>
18f6be63414c planemo upload for repository https://github.com/goeckslab/tools-mti/tree/main/tools/mti-utils commit 339f5497446066ca76c27460da2eef4f6e0fa36e
goeckslab
parents:
diff changeset
12
18f6be63414c planemo upload for repository https://github.com/goeckslab/tools-mti/tree/main/tools/mti-utils commit 339f5497446066ca76c27460da2eef4f6e0fa36e
goeckslab
parents:
diff changeset
13 <stdio>
18f6be63414c planemo upload for repository https://github.com/goeckslab/tools-mti/tree/main/tools/mti-utils commit 339f5497446066ca76c27460da2eef4f6e0fa36e
goeckslab
parents:
diff changeset
14 <regex match=".*XMLSyntaxError.*"
18f6be63414c planemo upload for repository https://github.com/goeckslab/tools-mti/tree/main/tools/mti-utils commit 339f5497446066ca76c27460da2eef4f6e0fa36e
goeckslab
parents:
diff changeset
15 source="stderr"
18f6be63414c planemo upload for repository https://github.com/goeckslab/tools-mti/tree/main/tools/mti-utils commit 339f5497446066ca76c27460da2eef4f6e0fa36e
goeckslab
parents:
diff changeset
16 level="fatal"
18f6be63414c planemo upload for repository https://github.com/goeckslab/tools-mti/tree/main/tools/mti-utils commit 339f5497446066ca76c27460da2eef4f6e0fa36e
goeckslab
parents:
diff changeset
17 description="XML metadata does not adhere to OME format. Considering converting image to OME-TIFF" />
18f6be63414c planemo upload for repository https://github.com/goeckslab/tools-mti/tree/main/tools/mti-utils commit 339f5497446066ca76c27460da2eef4f6e0fa36e
goeckslab
parents:
diff changeset
18 </stdio>
18f6be63414c planemo upload for repository https://github.com/goeckslab/tools-mti/tree/main/tools/mti-utils commit 339f5497446066ca76c27460da2eef4f6e0fa36e
goeckslab
parents:
diff changeset
19
2
d2c59a1ac0c4 planemo upload for repository https://github.com/goeckslab/tools-mti/tree/main/tools/mti-utils commit 130ef7e8ae6cab35866b72617e53d35acc11475a
goeckslab
parents: 0
diff changeset
20 <expand macro="version_cmd"/>
d2c59a1ac0c4 planemo upload for repository https://github.com/goeckslab/tools-mti/tree/main/tools/mti-utils commit 130ef7e8ae6cab35866b72617e53d35acc11475a
goeckslab
parents: 0
diff changeset
21
0
18f6be63414c planemo upload for repository https://github.com/goeckslab/tools-mti/tree/main/tools/mti-utils commit 339f5497446066ca76c27460da2eef4f6e0fa36e
goeckslab
parents:
diff changeset
22 <command detect_errors="aggressive"><![CDATA[
18f6be63414c planemo upload for repository https://github.com/goeckslab/tools-mti/tree/main/tools/mti-utils commit 339f5497446066ca76c27460da2eef4f6e0fa36e
goeckslab
parents:
diff changeset
23
18f6be63414c planemo upload for repository https://github.com/goeckslab/tools-mti/tree/main/tools/mti-utils commit 339f5497446066ca76c27460da2eef4f6e0fa36e
goeckslab
parents:
diff changeset
24 cp '$image' ./renamed_image.ome.tiff &&
18f6be63414c planemo upload for repository https://github.com/goeckslab/tools-mti/tree/main/tools/mti-utils commit 339f5497446066ca76c27460da2eef4f6e0fa36e
goeckslab
parents:
diff changeset
25
18f6be63414c planemo upload for repository https://github.com/goeckslab/tools-mti/tree/main/tools/mti-utils commit 339f5497446066ca76c27460da2eef4f6e0fa36e
goeckslab
parents:
diff changeset
26 ln -s '$channel_csv' ./channels.csv &&
18f6be63414c planemo upload for repository https://github.com/goeckslab/tools-mti/tree/main/tools/mti-utils commit 339f5497446066ca76c27460da2eef4f6e0fa36e
goeckslab
parents:
diff changeset
27
18f6be63414c planemo upload for repository https://github.com/goeckslab/tools-mti/tree/main/tools/mti-utils commit 339f5497446066ca76c27460da2eef4f6e0fa36e
goeckslab
parents:
diff changeset
28 python '$script'
18f6be63414c planemo upload for repository https://github.com/goeckslab/tools-mti/tree/main/tools/mti-utils commit 339f5497446066ca76c27460da2eef4f6e0fa36e
goeckslab
parents:
diff changeset
29
18f6be63414c planemo upload for repository https://github.com/goeckslab/tools-mti/tree/main/tools/mti-utils commit 339f5497446066ca76c27460da2eef4f6e0fa36e
goeckslab
parents:
diff changeset
30 ]]></command>
18f6be63414c planemo upload for repository https://github.com/goeckslab/tools-mti/tree/main/tools/mti-utils commit 339f5497446066ca76c27460da2eef4f6e0fa36e
goeckslab
parents:
diff changeset
31 <configfiles>
18f6be63414c planemo upload for repository https://github.com/goeckslab/tools-mti/tree/main/tools/mti-utils commit 339f5497446066ca76c27460da2eef4f6e0fa36e
goeckslab
parents:
diff changeset
32 <configfile name = "script">
18f6be63414c planemo upload for repository https://github.com/goeckslab/tools-mti/tree/main/tools/mti-utils commit 339f5497446066ca76c27460da2eef4f6e0fa36e
goeckslab
parents:
diff changeset
33 import os
18f6be63414c planemo upload for repository https://github.com/goeckslab/tools-mti/tree/main/tools/mti-utils commit 339f5497446066ca76c27460da2eef4f6e0fa36e
goeckslab
parents:
diff changeset
34 import sys
18f6be63414c planemo upload for repository https://github.com/goeckslab/tools-mti/tree/main/tools/mti-utils commit 339f5497446066ca76c27460da2eef4f6e0fa36e
goeckslab
parents:
diff changeset
35 import argparse
18f6be63414c planemo upload for repository https://github.com/goeckslab/tools-mti/tree/main/tools/mti-utils commit 339f5497446066ca76c27460da2eef4f6e0fa36e
goeckslab
parents:
diff changeset
36 import pandas as pd
18f6be63414c planemo upload for repository https://github.com/goeckslab/tools-mti/tree/main/tools/mti-utils commit 339f5497446066ca76c27460da2eef4f6e0fa36e
goeckslab
parents:
diff changeset
37 import ome_types
18f6be63414c planemo upload for repository https://github.com/goeckslab/tools-mti/tree/main/tools/mti-utils commit 339f5497446066ca76c27460da2eef4f6e0fa36e
goeckslab
parents:
diff changeset
38 from ome_types.model import channel
18f6be63414c planemo upload for repository https://github.com/goeckslab/tools-mti/tree/main/tools/mti-utils commit 339f5497446066ca76c27460da2eef4f6e0fa36e
goeckslab
parents:
diff changeset
39 from tifffile import tiffcomment
18f6be63414c planemo upload for repository https://github.com/goeckslab/tools-mti/tree/main/tools/mti-utils commit 339f5497446066ca76c27460da2eef4f6e0fa36e
goeckslab
parents:
diff changeset
40
18f6be63414c planemo upload for repository https://github.com/goeckslab/tools-mti/tree/main/tools/mti-utils commit 339f5497446066ca76c27460da2eef4f6e0fa36e
goeckslab
parents:
diff changeset
41 cwd = os.getcwd()
18f6be63414c planemo upload for repository https://github.com/goeckslab/tools-mti/tree/main/tools/mti-utils commit 339f5497446066ca76c27460da2eef4f6e0fa36e
goeckslab
parents:
diff changeset
42
18f6be63414c planemo upload for repository https://github.com/goeckslab/tools-mti/tree/main/tools/mti-utils commit 339f5497446066ca76c27460da2eef4f6e0fa36e
goeckslab
parents:
diff changeset
43 channels_df = pd.read_csv(os.path.join(cwd, 'channels.csv'))
18f6be63414c planemo upload for repository https://github.com/goeckslab/tools-mti/tree/main/tools/mti-utils commit 339f5497446066ca76c27460da2eef4f6e0fa36e
goeckslab
parents:
diff changeset
44
18f6be63414c planemo upload for repository https://github.com/goeckslab/tools-mti/tree/main/tools/mti-utils commit 339f5497446066ca76c27460da2eef4f6e0fa36e
goeckslab
parents:
diff changeset
45 original_ome_xml = tiffcomment(os.path.join(cwd, 'renamed_image.ome.tiff'))
18f6be63414c planemo upload for repository https://github.com/goeckslab/tools-mti/tree/main/tools/mti-utils commit 339f5497446066ca76c27460da2eef4f6e0fa36e
goeckslab
parents:
diff changeset
46 working_ome = ome_types.from_xml(original_ome_xml, parser = 'lxml')
18f6be63414c planemo upload for repository https://github.com/goeckslab/tools-mti/tree/main/tools/mti-utils commit 339f5497446066ca76c27460da2eef4f6e0fa36e
goeckslab
parents:
diff changeset
47
18f6be63414c planemo upload for repository https://github.com/goeckslab/tools-mti/tree/main/tools/mti-utils commit 339f5497446066ca76c27460da2eef4f6e0fa36e
goeckslab
parents:
diff changeset
48 for l_idx, level in enumerate(working_ome.images):
18f6be63414c planemo upload for repository https://github.com/goeckslab/tools-mti/tree/main/tools/mti-utils commit 339f5497446066ca76c27460da2eef4f6e0fa36e
goeckslab
parents:
diff changeset
49
18f6be63414c planemo upload for repository https://github.com/goeckslab/tools-mti/tree/main/tools/mti-utils commit 339f5497446066ca76c27460da2eef4f6e0fa36e
goeckslab
parents:
diff changeset
50 for c_idx, channel in enumerate(level.pixels.channels):
18f6be63414c planemo upload for repository https://github.com/goeckslab/tools-mti/tree/main/tools/mti-utils commit 339f5497446066ca76c27460da2eef4f6e0fa36e
goeckslab
parents:
diff changeset
51
18f6be63414c planemo upload for repository https://github.com/goeckslab/tools-mti/tree/main/tools/mti-utils commit 339f5497446066ca76c27460da2eef4f6e0fa36e
goeckslab
parents:
diff changeset
52 new_name = channels_df.loc[c_idx, 'marker_name']
18f6be63414c planemo upload for repository https://github.com/goeckslab/tools-mti/tree/main/tools/mti-utils commit 339f5497446066ca76c27460da2eef4f6e0fa36e
goeckslab
parents:
diff changeset
53 channel.name = new_name
18f6be63414c planemo upload for repository https://github.com/goeckslab/tools-mti/tree/main/tools/mti-utils commit 339f5497446066ca76c27460da2eef4f6e0fa36e
goeckslab
parents:
diff changeset
54
18f6be63414c planemo upload for repository https://github.com/goeckslab/tools-mti/tree/main/tools/mti-utils commit 339f5497446066ca76c27460da2eef4f6e0fa36e
goeckslab
parents:
diff changeset
55 if l_idx == 0:
18f6be63414c planemo upload for repository https://github.com/goeckslab/tools-mti/tree/main/tools/mti-utils commit 339f5497446066ca76c27460da2eef4f6e0fa36e
goeckslab
parents:
diff changeset
56
18f6be63414c planemo upload for repository https://github.com/goeckslab/tools-mti/tree/main/tools/mti-utils commit 339f5497446066ca76c27460da2eef4f6e0fa36e
goeckslab
parents:
diff changeset
57 print(f"Channel {c_idx} renamed to {new_name}")
18f6be63414c planemo upload for repository https://github.com/goeckslab/tools-mti/tree/main/tools/mti-utils commit 339f5497446066ca76c27460da2eef4f6e0fa36e
goeckslab
parents:
diff changeset
58
18f6be63414c planemo upload for repository https://github.com/goeckslab/tools-mti/tree/main/tools/mti-utils commit 339f5497446066ca76c27460da2eef4f6e0fa36e
goeckslab
parents:
diff changeset
59 updated_ome_xml = working_ome.to_xml()
18f6be63414c planemo upload for repository https://github.com/goeckslab/tools-mti/tree/main/tools/mti-utils commit 339f5497446066ca76c27460da2eef4f6e0fa36e
goeckslab
parents:
diff changeset
60 tiffcomment(os.path.join(cwd, 'renamed_image.ome.tiff'), updated_ome_xml)
18f6be63414c planemo upload for repository https://github.com/goeckslab/tools-mti/tree/main/tools/mti-utils commit 339f5497446066ca76c27460da2eef4f6e0fa36e
goeckslab
parents:
diff changeset
61
18f6be63414c planemo upload for repository https://github.com/goeckslab/tools-mti/tree/main/tools/mti-utils commit 339f5497446066ca76c27460da2eef4f6e0fa36e
goeckslab
parents:
diff changeset
62 print("Updated OME-TIFF metadata:")
18f6be63414c planemo upload for repository https://github.com/goeckslab/tools-mti/tree/main/tools/mti-utils commit 339f5497446066ca76c27460da2eef4f6e0fa36e
goeckslab
parents:
diff changeset
63 print(tiffcomment(os.path.join(cwd, 'renamed_image.ome.tiff')))
18f6be63414c planemo upload for repository https://github.com/goeckslab/tools-mti/tree/main/tools/mti-utils commit 339f5497446066ca76c27460da2eef4f6e0fa36e
goeckslab
parents:
diff changeset
64 </configfile>
18f6be63414c planemo upload for repository https://github.com/goeckslab/tools-mti/tree/main/tools/mti-utils commit 339f5497446066ca76c27460da2eef4f6e0fa36e
goeckslab
parents:
diff changeset
65 </configfiles>
18f6be63414c planemo upload for repository https://github.com/goeckslab/tools-mti/tree/main/tools/mti-utils commit 339f5497446066ca76c27460da2eef4f6e0fa36e
goeckslab
parents:
diff changeset
66 <inputs>
18f6be63414c planemo upload for repository https://github.com/goeckslab/tools-mti/tree/main/tools/mti-utils commit 339f5497446066ca76c27460da2eef4f6e0fa36e
goeckslab
parents:
diff changeset
67 <param name="image" type="data" format="ome.tiff" label="Input image in OME-tiff format"/>
18f6be63414c planemo upload for repository https://github.com/goeckslab/tools-mti/tree/main/tools/mti-utils commit 339f5497446066ca76c27460da2eef4f6e0fa36e
goeckslab
parents:
diff changeset
68 <param name="channel_csv" type="data" format="csv" label="Channel Metadata CSV"/>
18f6be63414c planemo upload for repository https://github.com/goeckslab/tools-mti/tree/main/tools/mti-utils commit 339f5497446066ca76c27460da2eef4f6e0fa36e
goeckslab
parents:
diff changeset
69 </inputs>
18f6be63414c planemo upload for repository https://github.com/goeckslab/tools-mti/tree/main/tools/mti-utils commit 339f5497446066ca76c27460da2eef4f6e0fa36e
goeckslab
parents:
diff changeset
70 <outputs>
18f6be63414c planemo upload for repository https://github.com/goeckslab/tools-mti/tree/main/tools/mti-utils commit 339f5497446066ca76c27460da2eef4f6e0fa36e
goeckslab
parents:
diff changeset
71 <data name="renamed_image" format="ome.tiff" from_work_dir="renamed_image.ome.tiff" label="${tool.name} on ${on_string}"/>
18f6be63414c planemo upload for repository https://github.com/goeckslab/tools-mti/tree/main/tools/mti-utils commit 339f5497446066ca76c27460da2eef4f6e0fa36e
goeckslab
parents:
diff changeset
72 </outputs>
18f6be63414c planemo upload for repository https://github.com/goeckslab/tools-mti/tree/main/tools/mti-utils commit 339f5497446066ca76c27460da2eef4f6e0fa36e
goeckslab
parents:
diff changeset
73 <tests>
18f6be63414c planemo upload for repository https://github.com/goeckslab/tools-mti/tree/main/tools/mti-utils commit 339f5497446066ca76c27460da2eef4f6e0fa36e
goeckslab
parents:
diff changeset
74 <test>
18f6be63414c planemo upload for repository https://github.com/goeckslab/tools-mti/tree/main/tools/mti-utils commit 339f5497446066ca76c27460da2eef4f6e0fa36e
goeckslab
parents:
diff changeset
75 <param name="image" value="rename_test.tiff" />
18f6be63414c planemo upload for repository https://github.com/goeckslab/tools-mti/tree/main/tools/mti-utils commit 339f5497446066ca76c27460da2eef4f6e0fa36e
goeckslab
parents:
diff changeset
76 <param name="channel_csv" value="rename_channels.csv" />
18f6be63414c planemo upload for repository https://github.com/goeckslab/tools-mti/tree/main/tools/mti-utils commit 339f5497446066ca76c27460da2eef4f6e0fa36e
goeckslab
parents:
diff changeset
77 <output name="renamed_image" ftype="ome.tiff">
18f6be63414c planemo upload for repository https://github.com/goeckslab/tools-mti/tree/main/tools/mti-utils commit 339f5497446066ca76c27460da2eef4f6e0fa36e
goeckslab
parents:
diff changeset
78 <assert_contents>
18f6be63414c planemo upload for repository https://github.com/goeckslab/tools-mti/tree/main/tools/mti-utils commit 339f5497446066ca76c27460da2eef4f6e0fa36e
goeckslab
parents:
diff changeset
79 <has_size value="44000" delta="1000" />
18f6be63414c planemo upload for repository https://github.com/goeckslab/tools-mti/tree/main/tools/mti-utils commit 339f5497446066ca76c27460da2eef4f6e0fa36e
goeckslab
parents:
diff changeset
80 </assert_contents>
18f6be63414c planemo upload for repository https://github.com/goeckslab/tools-mti/tree/main/tools/mti-utils commit 339f5497446066ca76c27460da2eef4f6e0fa36e
goeckslab
parents:
diff changeset
81 </output>
18f6be63414c planemo upload for repository https://github.com/goeckslab/tools-mti/tree/main/tools/mti-utils commit 339f5497446066ca76c27460da2eef4f6e0fa36e
goeckslab
parents:
diff changeset
82 <assert_stdout>
18f6be63414c planemo upload for repository https://github.com/goeckslab/tools-mti/tree/main/tools/mti-utils commit 339f5497446066ca76c27460da2eef4f6e0fa36e
goeckslab
parents:
diff changeset
83 <has_text text="Channel 0 renamed to DNA_6" />
18f6be63414c planemo upload for repository https://github.com/goeckslab/tools-mti/tree/main/tools/mti-utils commit 339f5497446066ca76c27460da2eef4f6e0fa36e
goeckslab
parents:
diff changeset
84 <has_text text="Updated OME-TIFF metadata" />
18f6be63414c planemo upload for repository https://github.com/goeckslab/tools-mti/tree/main/tools/mti-utils commit 339f5497446066ca76c27460da2eef4f6e0fa36e
goeckslab
parents:
diff changeset
85 </assert_stdout>
18f6be63414c planemo upload for repository https://github.com/goeckslab/tools-mti/tree/main/tools/mti-utils commit 339f5497446066ca76c27460da2eef4f6e0fa36e
goeckslab
parents:
diff changeset
86 </test>
18f6be63414c planemo upload for repository https://github.com/goeckslab/tools-mti/tree/main/tools/mti-utils commit 339f5497446066ca76c27460da2eef4f6e0fa36e
goeckslab
parents:
diff changeset
87 </tests>
18f6be63414c planemo upload for repository https://github.com/goeckslab/tools-mti/tree/main/tools/mti-utils commit 339f5497446066ca76c27460da2eef4f6e0fa36e
goeckslab
parents:
diff changeset
88 <help><![CDATA[
2
d2c59a1ac0c4 planemo upload for repository https://github.com/goeckslab/tools-mti/tree/main/tools/mti-utils commit 130ef7e8ae6cab35866b72617e53d35acc11475a
goeckslab
parents: 0
diff changeset
89 Given an OME.TIFF image and channel metadata CSV file, rename the image channels in the
d2c59a1ac0c4 planemo upload for repository https://github.com/goeckslab/tools-mti/tree/main/tools/mti-utils commit 130ef7e8ae6cab35866b72617e53d35acc11475a
goeckslab
parents: 0
diff changeset
90 OME XML metadata. CSV file must contain column 'marker_name' which will populate the XML
d2c59a1ac0c4 planemo upload for repository https://github.com/goeckslab/tools-mti/tree/main/tools/mti-utils commit 130ef7e8ae6cab35866b72617e53d35acc11475a
goeckslab
parents: 0
diff changeset
91 metadata with channel names in the order provided in the CSV file.
0
18f6be63414c planemo upload for repository https://github.com/goeckslab/tools-mti/tree/main/tools/mti-utils commit 339f5497446066ca76c27460da2eef4f6e0fa36e
goeckslab
parents:
diff changeset
92 ]]></help>
18f6be63414c planemo upload for repository https://github.com/goeckslab/tools-mti/tree/main/tools/mti-utils commit 339f5497446066ca76c27460da2eef4f6e0fa36e
goeckslab
parents:
diff changeset
93 <expand macro="citations" />
18f6be63414c planemo upload for repository https://github.com/goeckslab/tools-mti/tree/main/tools/mti-utils commit 339f5497446066ca76c27460da2eef4f6e0fa36e
goeckslab
parents:
diff changeset
94 </tool>