Back to home page

Project CMSSW displayed by LXR

 
 

    


File indexing completed on 2021-02-14 12:53:21

0001 #ifndef DataFormats_ForwardDetId_HFNoseTriggerDetId_H
0002 #define DataFormats_ForwardDetId_HFNoseTriggerDetId_H 1
0003 
0004 #include <iosfwd>
0005 #include <vector>
0006 #include "DataFormats/DetId/interface/DetId.h"
0007 #include "DataFormats/ForwardDetId/interface/ForwardSubdetector.h"
0008 #include "DataFormats/ForwardDetId/interface/HFNoseDetId.h"
0009 
0010 /* \brief description of the bit assigment
0011    [0:3]   u-coordinate of the cell (measured from the lower left
0012    [4:7]   v-coordinate of the cell  corner of the wafer)
0013    [8:11]  abs(u) of the wafer (u-axis points along -x axis)
0014    [12:12] sign of u (0:+u; 1:-u) (u=0 is at the center of beam line)
0015    [13:16] abs(v) of the wafer (v-axis points 60-degree wrt x-axis)
0016    [17:17] sign of v (0:+v; 1:-v) (v=0 is at the center of beam line)
0017    [18:22] layer number 
0018    [23:24] Type (0 fine divisions of wafer with 120 mum thick silicon
0019                  1 coarse divisions of wafer with 200 mum thick silicon
0020                  2 coarse divisions of wafer with 300 mum thick silicon)
0021    [25:26] Subdetector Type (HFNoseTrigger)
0022    [27:27] z-side (0 for +z; 1 for -z)
0023    [28:31] Detector type (HGCalTrigger)
0024 */
0025 
0026 class HFNoseTriggerDetId : public DetId {
0027 public:
0028   static const int HFNoseTriggerCell = 4;
0029 
0030   /** Create a null cellid*/
0031   HFNoseTriggerDetId();
0032   /** Create cellid from raw id (0=invalid tower id) */
0033   HFNoseTriggerDetId(uint32_t rawid);
0034   /** Constructor from subdetector, zplus, layer, module, cell numbers */
0035   HFNoseTriggerDetId(int subdet, int zp, int type, int layer, int waferU, int waferV, int cellU, int cellV);
0036   /** Constructor from a generic cell id */
0037   HFNoseTriggerDetId(const DetId& id);
0038   /** Assignment from a generic cell id */
0039   HFNoseTriggerDetId& operator=(const DetId& id);
0040 
0041   /// get the subdetector
0042   HGCalTriggerSubdetector subdet() const {
0043     return (HGCalTriggerSubdetector)((id_ >> kHFNoseSubdetOffset) & kHFNoseSubdetMask);
0044   }
0045 
0046   /// get the type
0047   int type() const { return (id_ >> kHFNoseTypeOffset) & kHFNoseTypeMask; }
0048 
0049   /// get the z-side of the cell (1/-1)
0050   int zside() const { return (((id_ >> kHFNoseZsideOffset) & kHFNoseZsideMask) ? -1 : 1); }
0051 
0052   /// get the layer #
0053   int layer() const { return (id_ >> kHFNoseLayerOffset) & kHFNoseLayerMask; }
0054 
0055   /** Converter for a geometry cell id */
0056   HFNoseDetId geometryCell() const { return HFNoseDetId(zside(), 0, layer(), waferU(), waferV(), 0, 0); }
0057   HFNoseDetId moduleId() const { return HFNoseDetId(zside(), type(), layer(), waferU(), waferV(), 0, 0); }
0058 
0059   /// get the cell #'s in u,v or in x,y
0060   int triggerCellU() const { return (id_ >> kHFNoseCellUOffset) & kHFNoseCellUMask; }
0061   int triggerCellV() const { return (id_ >> kHFNoseCellVOffset) & kHFNoseCellVMask; }
0062   std::pair<int, int> triggerCellUV() const { return std::pair<int, int>(triggerCellU(), triggerCellV()); }
0063   int triggerCellX() const;
0064   int triggerCellY() const;
0065   std::pair<int, int> triggerCellXY() const { return std::pair<int, int>(triggerCellX(), triggerCellY()); }
0066 
0067   /// get the wafer #'s in u,v or in x,y
0068   int waferUAbs() const { return (id_ >> kHFNoseWaferUOffset) & kHFNoseWaferUMask; }
0069   int waferVAbs() const { return (id_ >> kHFNoseWaferVOffset) & kHFNoseWaferVMask; }
0070   int waferU() const {
0071     return (((id_ >> kHFNoseWaferUSignOffset) & kHFNoseWaferUSignMask) ? -waferUAbs() : waferUAbs());
0072   }
0073   int waferV() const {
0074     return (((id_ >> kHFNoseWaferVSignOffset) & kHFNoseWaferVSignMask) ? -waferVAbs() : waferVAbs());
0075   }
0076   std::pair<int, int> waferUV() const { return std::pair<int, int>(waferU(), waferV()); }
0077   int waferX() const { return (-2 * waferU() + waferV()); }
0078   int waferY() const { return (2 * waferV()); }
0079   std::pair<int, int> waferXY() const { return std::pair<int, int>(waferX(), waferY()); }
0080 
0081   // get trigger cell u,v
0082   std::vector<int> cellU() const;
0083   std::vector<int> cellV() const;
0084   std::vector<std::pair<int, int> > cellUV() const;
0085 
0086   /// consistency check : no bits left => no overhead
0087   bool isEE() const { return (layer() <= kHFNoseMaxEELayer); }
0088   bool isHSilicon() const { return (layer() > kHFNoseMaxEELayer); }
0089   bool isForward() const { return true; }
0090 
0091   static const HFNoseTriggerDetId Undefined;
0092 
0093   static const int kHFNoseCellUOffset = 0;
0094   static const int kHFNoseCellUMask = 0xF;
0095   static const int kHFNoseCellVOffset = 4;
0096   static const int kHFNoseCellVMask = 0xF;
0097   static const int kHFNoseWaferUOffset = 8;
0098   static const int kHFNoseWaferUMask = 0xF;
0099   static const int kHFNoseWaferUSignOffset = 12;
0100   static const int kHFNoseWaferUSignMask = 0x1;
0101   static const int kHFNoseWaferVOffset = 13;
0102   static const int kHFNoseWaferVMask = 0xF;
0103   static const int kHFNoseWaferVSignOffset = 17;
0104   static const int kHFNoseWaferVSignMask = 0x1;
0105   static const int kHFNoseLayerOffset = 18;
0106   static const int kHFNoseLayerMask = 0x1F;
0107   static const int kHFNoseTypeOffset = 23;
0108   static const int kHFNoseTypeMask = 0x3;
0109   static const int kHFNoseZsideOffset = 27;
0110   static const int kHFNoseZsideMask = 0x1;
0111   static const int kHFNoseSubdetOffset = 25;
0112   static const int kHFNoseSubdetMask = 0x3;
0113   static const int kHFNoseMaxEELayer = 6;
0114 };
0115 
0116 std::ostream& operator<<(std::ostream&, const HFNoseTriggerDetId& id);
0117 
0118 #endif