ATLAS Offline Software
sTgcIdHelper.h
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2023 CERN for the benefit of the ATLAS collaboration
3 */
4 
5 // ******************************************************************************
6 // ATLAS Muon Identifier Helpers Package
7 // -----------------------------------------
8 // ******************************************************************************
9 
10 #ifndef MUONIDHELPERS_STGCIDHELPER_H
11 #define MUONIDHELPERS_STGCIDHELPER_H
12 
13 // Includes
15 
16 // ******************************************************************************
17 // class sTgcIdHelper
18 // ******************************************************************************//
19 // Description
20 // -----------
21 // This factory class constructs sTGC identifiers and ranges and provides access
22 // to the levels. ATLAS note ATL-MUON-2001-014 provides a complete description
23 // of the hierarchical identifier scheme. sTgcIdHelper provides an interface to the
24 // following fields of the identifier.
25 //
26 // Field Range Notes
27 // ==============================================================================
28 // diehl: todo: update this section for sTGC
29 // StationName unsigned integer maps to T1F,T3E,etc.
30 // StationEta [-4,-1] backward endcap (-1 at lowest R)
31 // [1,4] forward endcap (1 at lowest R)
32 // StationPhi [1,8] increases with phi
33 // Technology [4] maps to sTGC
34 // GasGap [1,2] doublet: increases with |Z|
35 // [1,3] triplet: increases with |Z|
36 // ChannelType [0,2] 0 if pad, 1 if strip, 2 if wire
37 // Channel [1,n] increases with R for channelType=1 (strip)
38 // increases with phi for channelType=2 (wire)
39 // increases with phi and R for channelType=0 (pad)
40 //
41 // ==============================================================================
42 //
43 // Inheritance
44 // -----------
45 // Inherits from MuonIdHelpers/MuonIdHelper.
46 //
47 // Authors
48 // ------
49 // Edward Diehl <diehl@umich.edu> based on TgcIdHelper.h
50 // Nektarios Chr. Benekos <nectarios.benekos@cern.ch>
51 // Philipp Fleischmann <philipp.fleischmann@cern.ch>
52 //
53 // ******************************************************************************
54 
55 class sTgcIdHelper : public MuonIdHelper {
56 public:
57  // Constructor
58  sTgcIdHelper();
59 
60  // Destructor
61  virtual ~sTgcIdHelper() = default;
62 
64 
66  virtual int initialize_from_dictionary(const IdDictMgr& dict_mgr) override;
67  virtual int get_module_hash(const Identifier& id, IdentifierHash& hash_id) const override;
68  virtual int get_detectorElement_hash(const Identifier& id, IdentifierHash& hash_id) const override;
69 
71 
72  // Identifier builders
74  Identifier elementID(int stationName, int stationEta, int stationPhi, bool& isValid) const;
75 
76  Identifier elementID(const std::string& stationNameStr, int stationEta, int stationPhi) const;
77  Identifier elementID(const std::string& stationNameStr, int stationEta, int stationPhi, bool& isValid) const;
78 
80 
81  Identifier channelID(int stationName, int stationEta, int stationPhi, int multilayer, int gasGap, int channelType, int channel) const;
83  bool& isValid) const;
84 
85  Identifier channelID(const std::string& stationNameStr, int stationEta, int stationPhi, int multilayer, int gasGap, int channelType,
86  int channel) const;
87  Identifier channelID(const std::string& stationNameStr, int stationEta, int stationPhi, int multilayer, int gasGap, int channelType,
88  int channel, bool& isValid) const;
89 
90  Identifier channelID(const Identifier& id, int multilayer, int gasGap, int channelType, int channel) const;
91  Identifier channelID(const Identifier& id, int multilayer, int gasGap, int channelType, int channel, bool& isValid) const;
92 
94  int padPhi) const;
96  bool& isValid) const;
97 
98  Identifier padID(const std::string& stationNameStr, int stationEta, int stationPhi, int multilayer, int gasGap, int channelType,
99  int padEta, int padPhi) const;
100  Identifier padID(const std::string& stationNameStr, int stationEta, int stationPhi, int multilayer, int gasGap, int channelType,
101  int padEta, int padPhi, bool& isValid) const;
102 
103  Identifier padID(const Identifier& id, int multilayer, int gasGap, int channelType, int padEta, int padPhi) const;
104  Identifier padID(const Identifier& id, int multilayer, int gasGap, int channelType, int padEta, int padPhi, bool& isValid) const;
105 
106  Identifier parentID(const Identifier& id) const;
107 
108  Identifier multilayerID(const Identifier& channeldID) const;
109  Identifier multilayerID(const Identifier& moduleID, int multilayer) const;
110  Identifier multilayerID(const Identifier& moduleID, int multilayer, bool& isValid) const;
111 
112 
113  /*
114  For the sTGCs each layer of a quadruplet is read out by two front end boards, one covering the strips (sFEB) and one covering the pads and wires (pFEBs).
115  This helper function creates a dummy identifier which can be associated with a front end board, which is primarily needed to deal with the correlation between DCS data and the hits in athena
116  sFEBs are always mapped to channel type strip and to channel one of the layer that is readout by this board. pFEBs are mapped to pad channel type and channel one of a layer.
117  The last fuction which just takes the identifier as an input is meant to convert hit identifiers to front end identifiers. It retruns the same fields as the input identifier except for channel which is set to 1 and for wire identifiers the channel type is set to pad.
118  */
119 
120  Identifier febID(int stationName, int stationEta, int stationPhi, int multilayer, int gasGap, int channelType) const;
121  Identifier febID(int stationName, int stationEta, int stationPhi, int multilayer, int gasGap, int channelType, bool& isValid) const;
122  Identifier febID(const std::string& stationName, int stationEta, int stationPhi, int multilayer, int gasGap, int channelType) const;
123  Identifier febID(const std::string& stationName, int stationEta, int stationPhi, int multilayer, int gasGap, int channelType, bool& isValid) const;
126  Identifier febID(const Identifier& channelID) const;
127 
128 
129  /*
130  One layer of sTGCs is segmented into 4 high voltage sections. Eta station 1 is divided into two hv sections while eta stations 2 and 3 consist of one HV section each. The HV sections are numbered from 1-4. The following functions introduce an identifier that is mapping to these HV sections. For eta stations 2 and 3 it returns the gas gap id, e.g. channel 1 on a give gas gap. For station eta 1, the channel is set sto one for the inner HV section while it is set to 100 for the outer HV section. This is an arbitary mapping, channel 100 does not correspond to the transition between the two HV section (the location is different depending on the module type and the gas gap). The hv identifier is arbitrily set to be a strip type channel.
131  */
132  Identifier hvID(int stationName, int stationEta, int stationPhi, int multilayer, int gasGap, bool isInnerQ1) const;
133  Identifier hvID(int stationName, int stationEta, int stationPhi, int multilayer, int gasGap, bool isInnerQ1, bool& isValid) const;
134  Identifier hvID(const std::string& stationName, int stationEta, int stationPhi, int multilayer, int gasGap, bool isInnerQ1) const;
135  Identifier hvID(const std::string& stationName, int stationEta, int stationPhi, int multilayer, int gasGap, bool isInnerQ1, bool& isValid) const;
136  Identifier hvID(const Identifier& channelId, bool isInnerQ1)const;
137  Identifier hvID(const Identifier& channelId, bool isInnerQ1, bool& isValid) const;
138 
139  // for an Identifier id, get the list of the daughter readout channel ids
140  void idChannels(const Identifier& id, std::vector<Identifier>& vect) const;
141 
142  // Access to levels: missing field returns 0
143  int gasGap(const Identifier& id) const override;
144  int multilayer(const Identifier& id) const;
145  int channelType(const Identifier& id) const;
146  bool measuresPhi(const Identifier& id) const override;
147  int channel(const Identifier& id) const override;
148  int numberOfMultilayers(const Identifier& id) const;
149  int padEta(const Identifier& id) const;
150  int padPhi(const Identifier& id) const;
151 
152  // Access to min and max of level ranges
153  // to be remove when we moved to compact ids
154  static int stationEtaMin() ;
155  static int stationEtaMax() ;
156  static int stationPhiMin() ;
157  static int stationPhiMax() ;
158  static int multilayerMin() ;
159  static int multilayerMax() ;
160  static int gasGapMin() ;
161  static int gasGapMax() ;
162  static int channelTypeMin() ;
163  static int channelTypeMax() ;
164  static int channelMin() ;
165  static int channelMax() ;
166  static int padEtaMin() ;
167  static int padEtaMax() ;
168  static int padPhiMin() ;
169  static int padPhiMax() ;
170 
171  // Access to min and max of level ranges
172  int stationEtaMin(const Identifier& id) const;
173  int stationEtaMax(const Identifier& id) const;
174  int stationPhiMin(const Identifier& id) const;
175  int stationPhiMax(const Identifier& id) const;
176  int multilayerMin(const Identifier& id) const;
177  int multilayerMax(const Identifier& id) const;
178  int gasGapMin(const Identifier& id) const;
179  int gasGapMax(const Identifier& id) const;
180  int channelTypeMin(const Identifier& id) const;
181  int channelTypeMax(const Identifier& id) const;
182  int channelMin(const Identifier& id) const;
183  int channelMax(const Identifier& id) const;
184 
185  // Public validation of levels
186  bool valid(const Identifier& id) const;
187  bool validElement(const Identifier& id) const;
188 
189  // Type indices
190  enum sTgcChannelTypes { Pad = 0, Strip = 1, Wire = 2 };
191 
192 private:
193  bool isStNameInTech(const std::string& stationName) const override;
194 
195  int init_id_to_hashes();
196 
198  static constexpr unsigned int s_stDim = 2;
200  static constexpr unsigned int s_etaDim = 6;
202  static constexpr unsigned int s_phiDim = 8;
204  static constexpr unsigned int s_mlDim = 2;
205 
206  static constexpr unsigned int s_modHashDim = s_stDim * s_etaDim * s_phiDim;
207  static constexpr unsigned int s_detHashDim = s_modHashDim * s_mlDim;
208 
209  std::array<unsigned int, s_modHashDim> m_module_hashes{};
210  std::array<unsigned int, s_detHashDim> m_detectorElement_hashes{};
211 
212  unsigned int moduleHashIdx(const Identifier& id) const;
213  unsigned int detEleHashIdx(const Identifier& id) const;
216 
217 
218  // compact id indices
221 
226 
227  // Check level values
228  bool validElement(const Identifier& id, int stationName, int stationEta, int stationPhi) const;
229  bool validChannel(const Identifier& id, int stationName, int stationEta, int stationPhi, int multilayer, int gasGap, int channelType,
230  int channel) const;
231  bool validChannel(const Identifier& id, int stationName, int stationEta, int stationPhi, int multilayer, int gasGap, int channelType,
232  int padEta, int padPhi) const;
233 
234  // Utility methods
235  int stgcTechnology() const;
236  bool LargeSector(int stationName) const;
237  bool SmallSector(int stationName) const;
238 
239  // Level indices
241 
242  // Level ranges
243  enum sTgcRanges {
255  ChannelMax = 315,
259  PadEtaMax = 18 // arbitrary values. these values should be taken from an XML
260  };
261 }; // end class sTgcIdHelper
262 /*******************************************************************************/
263 // For backwards compatibility
265 
266 CLASS_DEF(sTgcIdHelper, 4174, 1)
267 
268 #endif // MUONIDHELPERS_STGCIDHELPER_H
sTgcIdHelper::multilayer
int multilayer(const Identifier &id) const
Definition: sTgcIdHelper.cxx:1017
MuonIdHelper.h
sTgcIdHelper::sTgcIndices
sTgcIndices
Definition: sTgcIdHelper.h:240
sTgcIdHelper::m_detectorElement_hashes
std::array< unsigned int, s_detHashDim > m_detectorElement_hashes
Definition: sTgcIdHelper.h:210
sTgcIdHelper::m_mplet_impl
IdDictFieldImplementation m_mplet_impl
Definition: sTgcIdHelper.h:225
sTgcIdHelper::s_detHashDim
static constexpr unsigned int s_detHashDim
Definition: sTgcIdHelper.h:207
sTgcIdHelper::detEleHashIdx
unsigned int detEleHashIdx(const Identifier &id) const
Definition: sTgcIdHelper.cxx:251
sTgcIdHelper::initialize_from_dictionary
virtual int initialize_from_dictionary(const IdDictMgr &dict_mgr) override
Initialization from the identifier dictionary.
Definition: sTgcIdHelper.cxx:16
sTgcIdHelper::gasGapMax
static int gasGapMax()
Definition: sTgcIdHelper.cxx:1044
sTgcIdHelper::LargeSector
bool LargeSector(int stationName) const
Definition: sTgcIdHelper.cxx:1069
sTgcIdHelper::stationPhiMin
static int stationPhiMin()
Definition: sTgcIdHelper.cxx:1034
sTgcIdHelper::m_stationShift
unsigned int m_stationShift
Minimal station index found.
Definition: sTgcIdHelper.h:215
sTgcIdHelper::channelID
Identifier channelID(int stationName, int stationEta, int stationPhi, int multilayer, int gasGap, int channelType, int channel) const
Definition: sTgcIdHelper.cxx:886
max
constexpr double max()
Definition: ap_fixedTest.cxx:33
sTgcIdHelper::measuresPhi
bool measuresPhi(const Identifier &id) const override
returns measuresPhi
Definition: sTgcIdHelper.cxx:1025
sTgcIdHelper::gasGapMin
static int gasGapMin()
Definition: sTgcIdHelper.cxx:1042
sTgcIdHelper::s_etaDim
static constexpr unsigned int s_etaDim
-3, -2, -1, 1, 2, 3
Definition: sTgcIdHelper.h:200
sTgcIdHelper::GasGapMin
@ GasGapMin
Definition: sTgcIdHelper.h:250
sTGC_ID
sTgcIdHelper sTGC_ID
Definition: sTgcIdHelper.h:264
sTgcIdHelper::s_modHashDim
static constexpr unsigned int s_modHashDim
Definition: sTgcIdHelper.h:206
sTgcIdHelper::Strip
@ Strip
Definition: sTgcIdHelper.h:190
sTgcIdHelper::multilayerMin
static int multilayerMin()
Definition: sTgcIdHelper.cxx:1038
sTgcIdHelper::numberOfMultilayers
int numberOfMultilayers(const Identifier &id) const
Definition: sTgcIdHelper.cxx:477
MuonIdHelper::stationName
int stationName(const Identifier &id) const
Definition: MuonIdHelper.cxx:800
isValid
bool isValid(const T &p)
Av: we implement here an ATLAS-sepcific convention: all particles which are 99xxxxx are fine.
Definition: AtlasPID.h:620
sTgcIdHelper::sTgcChannelTypes
sTgcChannelTypes
Definition: sTgcIdHelper.h:190
sTgcIdHelper::PadPhiMin
@ PadPhiMin
Definition: sTgcIdHelper.h:256
sTgcIdHelper::PadPhiMax
@ PadPhiMax
Definition: sTgcIdHelper.h:257
sTgcIdHelper::MultilayerMin
@ MultilayerMin
Definition: sTgcIdHelper.h:248
sTgcIdHelper::MultilayerMax
@ MultilayerMax
Definition: sTgcIdHelper.h:249
sTgcIdHelper::StationPhiMax
@ StationPhiMax
Definition: sTgcIdHelper.h:247
AtlasDetectorID::size_type
Identifier::size_type size_type
Definition: AtlasDetectorID.h:384
sTgcIdHelper::StationEtaMax
@ StationEtaMax
Definition: sTgcIdHelper.h:245
sTgcIdHelper::StationEtaMin
@ StationEtaMin
Definition: sTgcIdHelper.h:244
sTgcIdHelper::PadEtaMin
@ PadEtaMin
Definition: sTgcIdHelper.h:258
IdDictMgr
Definition: IdDictMgr.h:14
sTgcIdHelper::MultilayerIndex
@ MultilayerIndex
Definition: sTgcIdHelper.h:240
sTgcIdHelper::stationEtaMin
static int stationEtaMin()
Definition: sTgcIdHelper.cxx:1030
sTgcIdHelper::m_typ_impl
IdDictFieldImplementation m_typ_impl
Definition: sTgcIdHelper.h:223
sTgcIdHelper::channelMax
static int channelMax()
Definition: sTgcIdHelper.cxx:1052
MuonIdHelper
Definition: MuonIdHelper.h:80
sTgcIdHelper::channel
int channel(const Identifier &id) const override
Definition: sTgcIdHelper.cxx:1027
sTgcIdHelper::stationPhiMax
static int stationPhiMax()
Definition: sTgcIdHelper.cxx:1036
sTgcIdHelper::ChannelMin
@ ChannelMin
Definition: sTgcIdHelper.h:254
sTgcIdHelper::s_mlDim
static constexpr unsigned int s_mlDim
2 multilayer
Definition: sTgcIdHelper.h:204
sTgcIdHelper::padPhiMax
static int padPhiMax()
Definition: sTgcIdHelper.cxx:1060
sTgcIdHelper::Wire
@ Wire
Definition: sTgcIdHelper.h:190
sTgcIdHelper::febID
Identifier febID(const Identifier &channelID, int channelType) const
sTgcIdHelper::ChannelIndex
@ ChannelIndex
Definition: sTgcIdHelper.h:240
sTgcIdHelper::validElement
bool validElement(const Identifier &id) const
Definition: sTgcIdHelper.cxx:735
sTgcIdHelper::channelTypeMax
static int channelTypeMax()
Definition: sTgcIdHelper.cxx:1048
sTgcIdHelper::gasGap
int gasGap(const Identifier &id) const override
get the hashes
Definition: sTgcIdHelper.cxx:1020
sTgcIdHelper::s_stDim
static constexpr unsigned int s_stDim
Small and big wedges.
Definition: sTgcIdHelper.h:198
sTgcIdHelper::sTgcIdHelper
sTgcIdHelper()
Definition: sTgcIdHelper.cxx:10
sTgcIdHelper::PadEtaMax
@ PadEtaMax
Definition: sTgcIdHelper.h:259
sTgcIdHelper::stationEtaMax
static int stationEtaMax()
Definition: sTgcIdHelper.cxx:1032
sTgcIdHelper::ChannelTypeMax
@ ChannelTypeMax
Definition: sTgcIdHelper.h:253
sTgcIdHelper::idChannels
void idChannels(const Identifier &id, std::vector< Identifier > &vect) const
Definition: sTgcIdHelper.cxx:385
CaloCondBlobAlgs_fillNoiseFromASCII.channelId
channelId
Definition: CaloCondBlobAlgs_fillNoiseFromASCII.py:122
sTgcIdHelper::padEtaMin
static int padEtaMin()
Definition: sTgcIdHelper.cxx:1054
sTgcIdHelper::m_module_hashes
std::array< unsigned int, s_modHashDim > m_module_hashes
Definition: sTgcIdHelper.h:209
MuonIdHelper::stationPhi
int stationPhi(const Identifier &id) const
Definition: MuonIdHelper.cxx:810
sTgcIdHelper::m_GASGAP_INDEX
size_type m_GASGAP_INDEX
Definition: sTgcIdHelper.h:219
sTgcIdHelper::m_CHANNELTYPE_INDEX
size_type m_CHANNELTYPE_INDEX
Definition: sTgcIdHelper.h:220
sTgcIdHelper::stgcTechnology
int stgcTechnology() const
Utility methods.
Definition: sTgcIdHelper.cxx:1063
sTgcIdHelper::padPhiMin
static int padPhiMin()
Definition: sTgcIdHelper.cxx:1058
sTgcIdHelper::multilayerMax
static int multilayerMax()
Definition: sTgcIdHelper.cxx:1040
sTgcIdHelper::channelMin
static int channelMin()
Definition: sTgcIdHelper.cxx:1050
sTgcIdHelper::padEtaMax
static int padEtaMax()
Definition: sTgcIdHelper.cxx:1056
sTgcIdHelper::init_id_to_hashes
int init_id_to_hashes()
Definition: sTgcIdHelper.cxx:255
sTgcIdHelper::padID
Identifier padID(int stationName, int stationEta, int stationPhi, int multilayer, int gasGap, int channelType, int padEta, int padPhi) const
Definition: sTgcIdHelper.cxx:939
sTgcIdHelper::valid
bool valid(const Identifier &id) const
Definition: sTgcIdHelper.cxx:690
sTgcIdHelper::m_cha_impl
IdDictFieldImplementation m_cha_impl
Definition: sTgcIdHelper.h:224
sTgcIdHelper
Definition: sTgcIdHelper.h:55
MuonIdHelper::stationEta
int stationEta(const Identifier &id) const
Definition: MuonIdHelper.cxx:805
sTgcIdHelper::get_detectorElement_hash
virtual int get_detectorElement_hash(const Identifier &id, IdentifierHash &hash_id) const override
Definition: sTgcIdHelper.cxx:288
sTgcIdHelper::parentID
Identifier parentID(const Identifier &id) const
Definition: sTgcIdHelper.cxx:1006
sTgcIdHelper::s_phiDim
static constexpr unsigned int s_phiDim
8 phi station
Definition: sTgcIdHelper.h:202
sTgcIdHelper::validChannel
bool validChannel(const Identifier &id, int stationName, int stationEta, int stationPhi, int multilayer, int gasGap, int channelType, int channel) const
Definition: sTgcIdHelper.cxx:781
sTgcIdHelper::m_gap_impl
IdDictFieldImplementation m_gap_impl
Definition: sTgcIdHelper.h:222
sTgcIdHelper::ChannelMax
@ ChannelMax
Definition: sTgcIdHelper.h:255
sTgcIdHelper::elementID
Identifier elementID(int stationName, int stationEta, int stationPhi) const
Definition: sTgcIdHelper.cxx:856
sTgcIdHelper::padPhi
int padPhi(const Identifier &id) const
Definition: sTgcIdHelper.cxx:679
sTgcIdHelper::get_module_hash
virtual int get_module_hash(const Identifier &id, IdentifierHash &hash_id) const override
Definition: sTgcIdHelper.cxx:281
sTgcIdHelper::StationPhiMin
@ StationPhiMin
Definition: sTgcIdHelper.h:246
sTgcIdHelper::GasGapMax
@ GasGapMax
Definition: sTgcIdHelper.h:251
CLASS_DEF
#define CLASS_DEF(NAME, CID, VERSION)
associate a clid and a version to a type eg
Definition: Control/AthenaKernel/AthenaKernel/CLASS_DEF.h:64
sTgcIdHelper::isStNameInTech
bool isStNameInTech(const std::string &stationName) const override
The valid element checks converted the identifier to a stationName string in order to assess whether ...
Definition: sTgcIdHelper.cxx:734
sTgcIdHelper::channelTypeMin
static int channelTypeMin()
Definition: sTgcIdHelper.cxx:1046
sTgcIdHelper::SmallSector
bool SmallSector(int stationName) const
Definition: sTgcIdHelper.cxx:1071
Pad
Definition: Pad.h:10
sTgcIdHelper::multilayerID
Identifier multilayerID(const Identifier &channeldID) const
Definition: sTgcIdHelper.cxx:297
sTgcIdHelper::padEta
int padEta(const Identifier &id) const
Definition: sTgcIdHelper.cxx:669
sTgcIdHelper::febID
Identifier febID(int stationName, int stationEta, int stationPhi, int multilayer, int gasGap, int channelType) const
Definition: sTgcIdHelper.cxx:322
sTgcIdHelper::moduleHashIdx
unsigned int moduleHashIdx(const Identifier &id) const
Definition: sTgcIdHelper.cxx:243
IdDictFieldImplementation
IdDictFieldImplementation is used to capture the specification of a single field of an Identifier.
Definition: IdDictFieldImplementation.h:58
IdentifierHash
This is a "hash" representation of an Identifier. This encodes a 32 bit index which can be used to lo...
Definition: IdentifierHash.h:25
sTgcIdHelper::~sTgcIdHelper
virtual ~sTgcIdHelper()=default
sTgcIdHelper::hvID
Identifier hvID(int stationName, int stationEta, int stationPhi, int multilayer, int gasGap, bool isInnerQ1) const
Definition: sTgcIdHelper.cxx:339
sTgcIdHelper::GasGapIndex
@ GasGapIndex
Definition: sTgcIdHelper.h:240
sTgcIdHelper::channelType
int channelType(const Identifier &id) const
Definition: sTgcIdHelper.cxx:1022
sTgcIdHelper::sTgcRanges
sTgcRanges
Definition: sTgcIdHelper.h:243
sTgcIdHelper::febID
Identifier febID(const Identifier &channelID, int channelType, bool &isValid) const
sTgcIdHelper::ChannelTypeIndex
@ ChannelTypeIndex
Definition: sTgcIdHelper.h:240
sTgcIdHelper::ChannelTypeMin
@ ChannelTypeMin
Definition: sTgcIdHelper.h:252
Identifier
Definition: IdentifierFieldParser.cxx:14