Back to home page

Project CMSSW displayed by LXR

 
 

    


File indexing completed on 2023-03-17 11:22:26

0001 #ifndef RecoTracker_MkFitCMS_interface_LayerNumberConverter_h
0002 #define RecoTracker_MkFitCMS_interface_LayerNumberConverter_h
0003 
0004 #include <stdexcept>
0005 
0006 namespace mkfit {
0007 
0008   enum struct TkLayout { phase0 = 0, phase1 = 1, phase2 = 2 };
0009 
0010   class LayerNumberConverter {
0011   public:
0012     LayerNumberConverter(TkLayout layout) : lo_(layout) {}
0013     void reset(TkLayout layout) { lo_ = layout; }
0014     unsigned int nLayers() const {
0015       if (lo_ == TkLayout::phase0)
0016         return 69;
0017       if (lo_ == TkLayout::phase1)
0018         return 72;
0019       if (lo_ == TkLayout::phase2)
0020         return 60;  // 4 + 12 + 2*(12 + 10) = 16 + 22 + 22 = 60
0021       return 10;
0022     }
0023     TkLayout getEra() const { return lo_; }
0024     int convertLayerNumber(int det, int lay, bool useMatched, int isStereo, bool posZ) const {
0025       if (lo_ == TkLayout::phase2) {
0026         if (det == 1)
0027           return lay - 1;
0028         if (det == 2)
0029           return 16 + lay - 1 + (posZ ? 0 : 22);
0030         if (det == 5)
0031           return 4 + (2 * (lay - 1)) + isStereo;
0032         if (det == 4)
0033           return 16 + 12 + (2 * (lay - 1)) + isStereo + (posZ ? 0 : 22);
0034         throw std::runtime_error("bad subDet");
0035       }
0036 
0037       if (det == 1 || det == 3 || det == 5) {
0038         return convertBarrelLayerNumber(det, lay, useMatched, isStereo);
0039       } else {
0040         int disk = convertDiskNumber(det, lay, useMatched, isStereo);
0041         if (disk < 0)
0042           return -1;
0043 
0044         int lOffset = 0;
0045         if (lo_ == TkLayout::phase1)
0046           lOffset = 1;
0047         disk += 17 + lOffset;
0048         if (!posZ)
0049           disk += 25 + 2 * lOffset;
0050         return disk;
0051       }
0052       return -1;
0053     }
0054     bool doesHaveStereo(int det, int lay) const {
0055       if (lo_ == TkLayout::phase2) {
0056         if (det == 1 || det == 2)
0057           return false;
0058         if (det == 4 || det == 5)
0059           return true;
0060         throw std::runtime_error("bad subDet");
0061       }
0062       if (det == 3 || det == 5) {
0063         return lay == 1 || lay == 2;
0064       }
0065       if (det == 4 || det == 6) {
0066         return true;
0067       }
0068       return false;
0069     }
0070 
0071     int convertBarrelLayerNumber(int cmsswdet, int cmsswlay, bool useMatched, int isStereo) const {
0072       int lOffset = 0;
0073       if (lo_ == TkLayout::phase1)
0074         lOffset = 1;
0075       if (cmsswdet == 2 || cmsswdet == 4 || cmsswdet == 6)
0076         return -1;  //FPIX, TID, TEC
0077       if (cmsswdet == 1)
0078         return cmsswlay - 1;  //BPIX
0079       if (useMatched) {
0080         //TIB
0081         if (cmsswdet == 3) {
0082           if (cmsswlay == 1 && isStereo == -1)
0083             return 3 + lOffset;
0084           else if (cmsswlay == 2 && isStereo == -1)
0085             return 4 + lOffset;
0086           else if (cmsswlay == 3 && isStereo == 0)
0087             return 5 + lOffset;
0088           else if (cmsswlay == 4 && isStereo == 0)
0089             return 6 + lOffset;
0090         }
0091         //TOB
0092         else if (cmsswdet == 5) {
0093           if (cmsswlay == 1 && isStereo == -1)
0094             return 7 + lOffset;
0095           else if (cmsswlay == 2 && isStereo == -1)
0096             return 8 + lOffset;
0097           else if (cmsswlay >= 3 && cmsswlay <= 6 && isStereo == 0)
0098             return 6 + cmsswlay + lOffset;
0099         }
0100         return -1;
0101       } else {
0102         //TIB
0103         if (cmsswdet == 3) {
0104           if ((cmsswlay == 1 || cmsswlay == 2) && (isStereo == 0 || isStereo == 1)) {
0105             return 1 + cmsswlay * 2 + isStereo + lOffset;
0106           } else if (cmsswlay == 3 && isStereo == 0)
0107             return 7 + lOffset;
0108           else if (cmsswlay == 4 && isStereo == 0)
0109             return 8 + lOffset;
0110         }
0111         //TOB
0112         else if (cmsswdet == 5) {
0113           if ((cmsswlay == 1 || cmsswlay == 2) && (isStereo == 0 || isStereo == 1)) {
0114             return 7 + cmsswlay * 2 + isStereo + lOffset;
0115           } else if (cmsswlay >= 3 && cmsswlay <= 6 && isStereo == 0)
0116             return 10 + cmsswlay + lOffset;
0117         }
0118         return -1;
0119       }
0120     }
0121     int convertDiskNumber(int cmsswdet, int cmsswdisk, bool useMatched, int isStereo) const {
0122       if (cmsswdet == 1 || cmsswdet == 3 || cmsswdet == 5)
0123         return -1;  //BPIX, TIB, TOB
0124       if (cmsswdet == 2)
0125         return cmsswdisk - 1;  //FPIX
0126       int lOffset = 0;
0127       if (lo_ == TkLayout::phase1)
0128         lOffset = 1;
0129       if (useMatched) {
0130         return -1;
0131       } else {
0132         if ((isStereo != 0 && isStereo != 1) || cmsswdisk < 1)
0133           return -1;
0134         //TID
0135         if (cmsswdet == 4 && cmsswdisk <= 3)
0136           return cmsswdisk * 2 + isStereo + lOffset;
0137         //TEC
0138         else if (cmsswdet == 6 && cmsswdisk <= 9)
0139           return 6 + cmsswdisk * 2 + isStereo + lOffset;
0140         return -1;
0141       }
0142     }
0143 
0144   private:
0145     TkLayout lo_;
0146   };
0147 
0148 }  // end namespace mkfit
0149 
0150 #endif