91 uint16_t encodeMuonLayer(
const DetId&
id) {
92 uint16_t detid =
id.det();
93 uint16_t subdet =
id.subdetId();
109 layer = ((rpcid.
station() - 1) << 2);
110 layer |= (rpcid.
station() <= 2) ? ((rpcid.
layer() - 1) << 1) : 0x0;
117 layer = ((gemid.
station()-1)<<2);
127 layer = (me0id.
roll());
138 uint16_t detid =
id.det();
139 uint16_t subdet =
id.subdetId();
142 uint16_t layer = 0x0;
144 layer = ttopo.
layer(
id);
146 layer = encodeMuonLayer(
id);
157 return encode(detid, subdet, layer, side, hitType);
223 <<
" were stored on this object before hits of some other category were inserted " 224 <<
"but hits of the same category should be inserted in a row. " 225 <<
"Please rework the code so it inserts all " 236 <<
"MISSING_INNER_HITS" 237 <<
" were stored on this object before hits of some other category were inserted " 238 <<
"but hits of the same category should be inserted in a row. " 239 <<
"Please rework the code so it inserts all " 240 <<
"MISSING_INNER_HITS" 250 <<
"MISSING_OUTER_HITS" 251 <<
" were stored on this object before hits of some other category were inserted " 252 <<
"but hits of the same category should be inserted in a row. " 253 <<
"Please rework the code so it inserts all " 254 <<
"MISSING_OUTER_HITS" 276 throw cms::Exception(
"HitPattern") <<
"Got DetId from det " <<
id.det() <<
" that is not Muon in appendMuonHit(), which should only be used for muon hits in the HitPattern IO rule";
279 uint16_t detid =
id.det();
280 uint16_t subdet =
id.subdetId();
281 return appendHit(
encode(detid, subdet, encodeMuonLayer(
id), 0, hitType), hitType);
310 uint16_t bitEndOffset = (position + 1) *
HIT_LENGTH;
311 uint8_t secondWord = (bitEndOffset >> 4);
312 uint8_t secondWordBits = bitEndOffset & (16 - 1);
314 uint8_t lowBitsToTrash = secondWordBits -
HIT_LENGTH;
315 uint16_t myResult = (
hitPattern[secondWord] >> lowBitsToTrash) & ((1 << HIT_LENGTH) - 1);
318 uint8_t firstWordBits =
HIT_LENGTH - secondWordBits;
319 uint16_t firstWordBlock =
hitPattern[secondWord - 1] >> (16 - firstWordBits);
320 uint16_t secondWordBlock =
hitPattern[secondWord] & ((1 << secondWordBits) - 1);
321 uint16_t myResult = firstWordBlock + (secondWordBlock << firstWordBits);
345 memset(hasMono, 0,
sizeof(hasMono));
346 memset(hasStereo, 0,
sizeof(hasStereo));
354 if (stripdet != 0 && subStructure != stripdet) {
364 hasMono[subStructure][
getLayer(pattern)] =
true;
367 hasStereo[subStructure][
getLayer(pattern)] =
true;
379 for (
int j = 0; j <
LayerMask + 1; ++j) {
380 if (hasMono[
i][j] && hasStereo[
i][j]) {
391 std::bitset<128> side[2];
393 for (
int i = range.first;
i < range.second; ++
i) {
397 if (hitType != HIT_TYPE::VALID)
continue;
403 return (side[0]&side[1]).count();
444 for (
int i = range.first;
i < range.second; ++
i) {
446 if ((pattern & mask) == tk_substr_layer) {
448 if (hitType < layerCase) {
450 layerCase = (hitType ==
HIT_TYPE::BAD ? HIT_TYPE::INACTIVE : hitType);
451 if (layerCase == HIT_TYPE::VALID) {
473 uint16_t monoStereo = 0x0;
475 for (
int i = range.first;
i < range.second; ++
i) {
477 if ((pattern & mask) == tk_substr_layer) {
479 if (hitType == HIT_TYPE::VALID) {
501 std::bitset<128> layerOk;
503 for (
int i = range.first;
i < range.second; ++
i) {
508 if (hitType != HIT_TYPE::VALID)
continue;
514 return layerOk.count();
520 std::bitset<128> layerOk;
522 for (
int i = range.first;
i < range.second; ++
i) {
526 if (hitType != HIT_TYPE::VALID)
continue;
532 return layerOk.count();
536 std::bitset<128> layerOk;
537 std::bitset<128> layerMissed;
539 for (
int i = range.first;
i < range.second; ++
i) {
545 if (hitType == HIT_TYPE::VALID) layerOk.set(
pattern);
546 if (hitType == HIT_TYPE::MISSING) layerMissed.set(
pattern);
548 layerMissed &= ~layerOk;
552 return layerMissed.count();
561 uint16_t NPixBarrel = 4;
562 for (uint16_t layer = 1; layer <= NPixBarrel; layer++) {
573 uint16_t NPixForward = 3;
574 for (uint16_t layer = 1; layer <= NPixForward; layer++) {
585 for (uint16_t layer = 1; layer <= 4; layer++) {
596 for (uint16_t layer = 1; layer <= 3; layer++) {
607 for (uint16_t layer = 1; layer <= 6; layer++) {
618 for (uint16_t layer = 1; layer <= 9; layer++) {
629 uint16_t NPixBarrel = 4;
630 for (uint16_t layer = 1; layer <= NPixBarrel; layer++) {
641 uint16_t NPixForward = 3;
642 for (uint16_t layer = 1; layer <= NPixForward; layer++) {
653 for (uint16_t layer = 1; layer <= 4; layer++) {
664 for (uint16_t layer = 1; layer <= 3; layer++) {
675 for (uint16_t layer = 1; layer <= 6; layer++) {
686 for (uint16_t layer = 1; layer <= 9; layer++) {
698 uint16_t NPixBarrel = 4;
699 for (uint16_t layer = 1; layer <= NPixBarrel; layer++) {
710 uint16_t NPixForward = 3;
711 for (uint16_t layer = 1; layer <= NPixForward; layer++) {
722 for (uint16_t layer = 1; layer <= 4; layer++) {
733 for (uint16_t layer = 1; layer <= 3; layer++) {
744 for (uint16_t layer = 1; layer <= 6; layer++) {
756 for (uint16_t layer = 1; layer <= 9; layer++) {
767 uint16_t NPixBarrel = 4;
768 for (uint16_t layer = 1; layer <= NPixBarrel; layer++) {
779 uint16_t NPixForward = 3;
780 for (uint16_t layer = 1; layer <= NPixForward; layer++) {
791 for (uint16_t layer = 1; layer <= 4; layer++) {
802 for (uint16_t layer = 1; layer <= 3; layer++) {
813 for (uint16_t layer = 1; layer <= 6; layer++) {
824 for (uint16_t layer = 1; layer <= 9; layer++) {
848 stream <<
"\tcsc ring " <<
getCSCRing(pattern);
850 stream <<
"\trpc " << (
getRPCregion(pattern) ?
"endcaps" :
"barrel")
853 stream <<
"\tgem " << (
getGEMLayer(pattern) ?
"layer1" :
"layer2")
858 stream <<
"(UNKNOWN Muon SubStructure!) \tsubsubstructure " 862 stream <<
"\tlayer " <<
getLayer(pattern);
864 stream <<
"\thit type " <<
getHitType(pattern);
870 stream <<
"HitPattern" << std::endl;
874 std::ios_base::fmtflags
flags = stream.flags();
875 stream.setf(std::ios_base::hex, std::ios_base::basefield);
876 stream.setf(std::ios_base::showbase);
910 int stations[4] = {0, 0, 0, 0};
915 && (hitType == -1 ||
int(
getHitType(pattern)) == hitType)) {
920 return stations[0] + stations[1] + stations[2] + stations[3];
929 && (hitType == -1 ||
int(
getHitType(pattern)) == hitType)) {
931 if (ret == 0 || stat < ret) {
946 (hitType == -1 ||
int(
getHitType(pattern)) == hitType)) {
948 if (ret == 0 || stat > ret) {
958 int stations[4] = {0, 0, 0, 0};
967 return stations[0] + stations[1] + stations[2] + stations[3];
972 int stations[4] = {0, 0, 0, 0};
980 return stations[0] + stations[1] + stations[2] + stations[3];
985 int stations[4][2] = {{0, 0}, {0, 0}, {0, 0}, {0, 0}};
993 return stations[0][0] * stations[0][1]
994 + stations[1][0] * stations[1][1]
995 + stations[2][0] * stations[2][1]
996 + stations[3][0] * stations[3][1];
1003 int pos = offset +
i;
1004 uint16_t bit = (pattern >>
i) & 0
x1;
1006 hitPattern[pos >> 4] += bit << ((offset +
i) & (16 - 1));
int stripTOBLayersTotallyOffOrBad(HitCategory category=TRACK_HITS) const
int stripTOBLayersWithMeasurement() const
static uint16_t getCSCRing(uint16_t pattern)
CSC ring (1-4). Only valid for muon CSC patterns, of course.
int pixelBarrelLayersWithoutMeasurement(HitCategory category) const
static uint32_t getLayer(uint16_t pattern)
void insertHit(const uint16_t pattern)
int outermostMuonStationWithHits(int hitType) const
hitType=-1(all), 0=valid, 3=bad; 0 = no stations at all
static const unsigned short HIT_LENGTH
static const unsigned short ARRAY_LENGTH
static const uint32_t NULL_RETURN
int pixelBarrelLayersNull() const
static bool pixelHitFilter(uint16_t pattern)
int stripTIBLayersNull() const
int pixelBarrelLayersTotallyOffOrBad(HitCategory category=TRACK_HITS) const
bool hasValidHitInPixelLayer(enum PixelSubdetector::SubDetector, uint16_t layer) const
static uint16_t isStereo(DetId i, const TrackerTopology &ttopo)
bool tobIsStereo(const DetId &id) const
int stripTIBLayersWithMeasurement() const
int stripTECLayersNull() const
static const unsigned short SideOffset
static const uint16_t EMPTY_PATTERN
int muonStations(int subdet, int hitType) const
subdet = 0(all), 1(DT), 2(CSC), 3(RPC) 4(GEM); hitType=-1(all), 0=valid, 3=bad
static uint16_t getDTSuperLayer(uint16_t pattern)
DT superlayer (1-3). Where the "hit" was a DT segment, superlayer is 0. Only valid for muon DT patter...
static bool muonME0HitFilter(uint16_t pattern)
static const unsigned short SubstrOffset
int stripTOBLayersWithoutMeasurement(HitCategory category) const
int numberOfDTStationsWithRPhiView() const
HitPattern & operator=(const HitPattern &other)
uint16_t getTrackerMonoStereo(HitCategory category, uint16_t substr, uint16_t layer) const
static const unsigned short MaxHits
uint32_t getTrackerLayerCase(HitCategory category, uint16_t substr, uint16_t layer) const
std::vector< Variable::Flags > flags
int pixelLayersWithMeasurement() const
int numberOfValidStripLayersWithMonoAndStereo() const
int pixelEndcapLayersWithoutMeasurement(HitCategory category) const
int trackerLayersWithMeasurement() const
static const unsigned short HitTypeMask
static bool pixelBarrelHitFilter(uint16_t pattern)
int pixelEndcapLayersWithMeasurement() const
bool insertExpectedOuterHit(const uint16_t pattern)
bool tidIsStereo(const DetId &id) const
static bool pixelEndcapHitFilter(uint16_t pattern)
static bool validHitFilter(uint16_t pattern)
void printHitPattern(HitCategory category, int position, std::ostream &stream) const
bool tecIsStereo(const DetId &id) const
static uint16_t getGEMLayer(uint16_t pattern)
GEM layer: 1,2. Only valid for muon GEM patterns, of course.
static const unsigned short minTrackerWord
uint16_t hitPattern[ARRAY_LENGTH]
int stripTIBLayersTotallyOffOrBad(HitCategory category=TRACK_HITS) const
static bool muonCSCHitFilter(uint16_t pattern)
static uint32_t getHitType(uint16_t pattern)
int numberOfValidTECLayersWithMonoAndStereo(uint32_t layer=0) const
int stripTIDLayersWithMeasurement() const
static const unsigned short SubDetectorMask
int layer() const
Layer id: each station have two layers of chambers: layer 1 is the inner chamber and layer 2 is the o...
static bool stripHitFilter(uint16_t pattern)
int numberOfAllHits(HitCategory category) const
int station() const
Station id : the station is the pair of chambers at same disk.
Abs< T >::type abs(const T &t)
int superLayer() const
Return the superlayer number.
bool appendHit(const TrackingRecHit &hit, const TrackerTopology &ttopo)
int numberOfDTStationsWithRZView() const
int stripTIDLayersNull() const
static const unsigned short HitTypeOffset
int subdetId() const
get the contents of the subdetector field (not cast into any detector's numbering enum) ...
int numberOfValidTIDLayersWithMonoAndStereo(uint32_t layer=0) const
bool appendTrackerHit(uint16_t subdet, uint16_t layer, uint16_t stereo, TrackingRecHit::Type hitType)
static uint32_t getSubStructure(uint16_t pattern)
int numberOfDTStationsWithBothViews() const
int numberOfValidTIBLayersWithMonoAndStereo(uint32_t layer=0) const
static uint16_t getRPCregion(uint16_t pattern)
RPC region: 0 = barrel, 1 = endcap. Only valid for muon RPC patterns, of course.
static bool muonGEMHitFilter(uint16_t pattern)
static uint16_t getGEMStation(uint16_t pattern)
GEM station: 1,2. Only valid for muon GEM patterns, of course.
int stripTIDLayersWithoutMeasurement(HitCategory category) const
int innermostMuonStationWithHits(int hitType) const
hitType=-1(all), 0=valid, 3=bad; 0 = no stations at all
static bool muonHitFilter(uint16_t pattern)
static bool trackerHitFilter(uint16_t pattern)
static const unsigned short SideMask
static const unsigned short minStripWord
std::pair< uint8_t, uint8_t > getCategoryIndexRange(HitCategory category) const
static const unsigned short SubDetectorOffset
bool tibIsStereo(const DetId &id) const
int pixelBarrelLayersWithMeasurement() const
unsigned int layer(const DetId &id) const
uint16_t getHitPatternByAbsoluteIndex(int position) const
static uint32_t getSide(uint16_t pattern)
int stripTOBLayersNull() const
static bool muonDTHitFilter(uint16_t pattern)
int stripTIDLayersTotallyOffOrBad(HitCategory category=TRACK_HITS) const
int trackerLayersWithoutMeasurement(HitCategory category) const
bool insertExpectedInnerHit(const uint16_t pattern)
static const unsigned short SubstrMask
static const unsigned short LayerOffset
static int position[264][3]
int pixelEndcapLayersTotallyOffOrBad(HitCategory category=TRACK_HITS) const
bool insertTrackHit(const uint16_t pattern)
int stripTECLayersWithMeasurement() const
int stripTECLayersWithoutMeasurement(HitCategory category) const
static uint16_t getRPCLayer(uint16_t pattern)
RPC layer: for station 1 and 2, layer = 1(inner) or 2(outer); for station 3, 4 layer is always 0...
static uint16_t getMuonStation(uint16_t pattern)
Muon station (1-4). Only valid for muon patterns, of course. only for patterns from muon...
void print(HitCategory category, std::ostream &stream=std::cout) const
int numberOfValidTOBLayersWithMonoAndStereo(uint32_t layer=0) const
DetId geographicalId() const
static uint32_t getSubSubStructure(uint16_t pattern)
uint16_t getHitPattern(HitCategory category, int position) const
int station() const
Return the station number.
static const unsigned short LayerMask
Detector det() const
get the detector field from this detid
static bool muonRPCHitFilter(uint16_t pattern)
static uint16_t encode(const TrackingRecHit &hit, const TrackerTopology &ttopo)
int stripTECLayersTotallyOffOrBad(HitCategory category=TRACK_HITS) const
int stripTIBLayersWithoutMeasurement(HitCategory category) const
bool appendMuonHit(const DetId &id, TrackingRecHit::Type hitType)
int pixelEndcapLayersNull() const
int region() const
Region id: 0 for Barrel, +/-1 For +/- Endcap.