33 hitCount(other.hitCount),
34 beginTrackHits(other.beginTrackHits),
35 endTrackHits(other.endTrackHits),
36 beginInner(other.beginInner),
37 endInner(other.endInner),
38 beginOuter(other.beginOuter),
39 endOuter(other.endOuter)
95 uint16_t encodeMuonLayer(
const DetId&
id) {
96 uint16_t
detid =
id.det();
97 uint16_t subdet =
id.subdetId();
103 layer = ((
DTLayerId(
id.rawId()).station() - 1) << 2);
104 layer |=
DTLayerId(
id.rawId()).superLayer();
107 layer = ((
CSCDetId(
id.rawId()).station() - 1) << 2);
108 layer |= (
CSCDetId(
id.rawId()).ring() - 1);
113 layer = ((rpcid.station() - 1) << 2);
114 layer |= (rpcid.station() <= 2) ? ((rpcid.layer() - 1) << 1) : 0x0;
115 layer |=
abs(rpcid.region());
121 layer = ((gemid.station()-1)<<2);
122 layer |=
abs(gemid.layer()-1);
133 uint16_t detid =
id.det();
134 uint16_t subdet =
id.subdetId();
137 uint16_t layer = 0x0;
139 layer = ttopo.
layer(
id);
141 layer = encodeMuonLayer(
id);
152 return encode(detid, subdet, layer, side, hitType);
214 <<
" were stored on this object before hits of some other category were inserted "
215 <<
"but hits of the same category should be inserted in a row. "
216 <<
"Please rework the code so it inserts all "
226 <<
"MISSING_INNER_HITS"
227 <<
" were stored on this object before hits of some other category were inserted "
228 <<
"but hits of the same category should be inserted in a row. "
229 <<
"Please rework the code so it inserts all "
230 <<
"MISSING_INNER_HITS"
239 <<
"MISSING_OUTER_HITS"
240 <<
" were stored on this object before hits of some other category were inserted "
241 <<
"but hits of the same category should be inserted in a row. "
242 <<
"Please rework the code so it inserts all "
243 <<
"MISSING_OUTER_HITS"
265 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";
268 uint16_t detid =
id.det();
269 uint16_t subdet =
id.subdetId();
270 return appendHit(
encode(detid, subdet, encodeMuonLayer(
id), 0, hitType), hitType);
299 uint16_t bitEndOffset = (position + 1) *
HIT_LENGTH;
300 uint8_t secondWord = (bitEndOffset >> 4);
301 uint8_t secondWordBits = bitEndOffset & (16 - 1);
303 uint8_t lowBitsToTrash = secondWordBits -
HIT_LENGTH;
304 uint16_t myResult = (
hitPattern[secondWord] >> lowBitsToTrash) & ((1 << HIT_LENGTH) - 1);
307 uint8_t firstWordBits =
HIT_LENGTH - secondWordBits;
308 uint16_t firstWordBlock =
hitPattern[secondWord - 1] >> (16 - firstWordBits);
309 uint16_t secondWordBlock =
hitPattern[secondWord] & ((1 << secondWordBits) - 1);
310 uint16_t myResult = firstWordBlock + (secondWordBlock << firstWordBits);
343 memset(hasMono, 0,
sizeof(hasMono));
344 memset(hasStereo, 0,
sizeof(hasStereo));
352 if (stripdet != 0 && subStructure != stripdet) {
362 hasMono[subStructure][
getLayer(pattern)] =
true;
365 hasStereo[subStructure][
getLayer(pattern)] =
true;
378 if (hasMono[
i][
j] && hasStereo[
i][
j]) {
389 std::bitset<128> side[2];
391 for (
int i = range.first;
i < range.second; ++
i) {
395 if (hitType != HIT_TYPE::VALID)
continue;
401 return (side[0]&side[1]).count();
442 for (
int i = range.first;
i < range.second; ++
i) {
444 if ((pattern & mask) == tk_substr_layer) {
446 if (hitType < layerCase) {
448 layerCase = (hitType ==
HIT_TYPE::BAD ? HIT_TYPE::INACTIVE : hitType);
449 if (layerCase == HIT_TYPE::VALID) {
471 uint16_t monoStereo = 0x0;
473 for (
int i = range.first;
i < range.second; ++
i) {
475 if ((pattern & mask) == tk_substr_layer) {
477 if (hitType == HIT_TYPE::VALID) {
499 std::bitset<128> layerOk;
501 for (
int i = range.first;
i < range.second; ++
i) {
506 if (hitType != HIT_TYPE::VALID)
continue;
512 return layerOk.count();
518 std::bitset<128> layerOk;
520 for (
int i = range.first;
i < range.second; ++
i) {
524 if (hitType != HIT_TYPE::VALID)
continue;
530 return layerOk.count();
534 std::bitset<128> layerOk;
535 std::bitset<128> layerMissed;
537 for (
int i = range.first;
i < range.second; ++
i) {
543 if (hitType == HIT_TYPE::VALID) layerOk.set(
pattern);
544 if (hitType == HIT_TYPE::MISSING) layerMissed.set(
pattern);
546 layerMissed &= ~layerOk;
550 return layerMissed.count();
559 uint16_t NPixBarrel = 4;
560 for (uint16_t layer = 1; layer <= NPixBarrel; layer++) {
571 uint16_t NPixForward = 3;
572 for (uint16_t layer = 1; layer <= NPixForward; layer++) {
583 for (uint16_t layer = 1; layer <= 4; layer++) {
594 for (uint16_t layer = 1; layer <= 3; layer++) {
605 for (uint16_t layer = 1; layer <= 6; layer++) {
616 for (uint16_t layer = 1; layer <= 9; layer++) {
627 uint16_t NPixBarrel = 4;
628 for (uint16_t layer = 1; layer <= NPixBarrel; layer++) {
639 uint16_t NPixForward = 3;
640 for (uint16_t layer = 1; layer <= NPixForward; layer++) {
651 for (uint16_t layer = 1; layer <= 4; layer++) {
662 for (uint16_t layer = 1; layer <= 3; layer++) {
673 for (uint16_t layer = 1; layer <= 6; layer++) {
684 for (uint16_t layer = 1; layer <= 9; layer++) {
696 uint16_t NPixBarrel = 4;
697 for (uint16_t layer = 1; layer <= NPixBarrel; layer++) {
708 uint16_t NPixForward = 3;
709 for (uint16_t layer = 1; layer <= NPixForward; layer++) {
720 for (uint16_t layer = 1; layer <= 4; layer++) {
731 for (uint16_t layer = 1; layer <= 3; layer++) {
742 for (uint16_t layer = 1; layer <= 6; layer++) {
754 for (uint16_t layer = 1; layer <= 9; layer++) {
765 uint16_t NPixBarrel = 4;
766 for (uint16_t layer = 1; layer <= NPixBarrel; layer++) {
777 uint16_t NPixForward = 3;
778 for (uint16_t layer = 1; layer <= NPixForward; layer++) {
789 for (uint16_t layer = 1; layer <= 4; layer++) {
800 for (uint16_t layer = 1; layer <= 3; layer++) {
811 for (uint16_t layer = 1; layer <= 6; layer++) {
822 for (uint16_t layer = 1; layer <= 9; layer++) {
846 stream <<
"\tcsc ring " <<
getCSCRing(pattern);
848 stream <<
"\trpc " << (
getRPCregion(pattern) ?
"endcaps" :
"barrel")
851 stream <<
"\tgem " << (
getGEMLayer(pattern) ?
"layer1" :
"layer2")
854 stream <<
"(UNKNOWN Muon SubStructure!) \tsubsubstructure "
858 stream <<
"\tlayer " <<
getLayer(pattern);
860 stream <<
"\thit type " <<
getHitType(pattern);
866 stream <<
"HitPattern" << std::endl;
870 std::ios_base::fmtflags
flags = stream.flags();
871 stream.setf(std::ios_base::hex, std::ios_base::basefield);
872 stream.setf(std::ios_base::showbase);
911 && (hitType == -1 ||
int(
getHitType(pattern)) == hitType)) {
916 return stations[0] + stations[1] + stations[2] + stations[3];
925 && (hitType == -1 ||
int(
getHitType(pattern)) == hitType)) {
927 if (ret == 0 || stat < ret) {
942 (hitType == -1 ||
int(
getHitType(pattern)) == hitType)) {
944 if (ret == 0 || stat > ret) {
963 return stations[0] + stations[1] + stations[2] + stations[3];
976 return stations[0] + stations[1] + stations[2] + stations[3];
981 int stations[4][2] = {{0, 0}, {0, 0}, {0, 0}, {0, 0}};
989 return stations[0][0] * stations[0][1]
990 + stations[1][0] * stations[1][1]
991 + stations[2][0] * stations[2][1]
992 + stations[3][0] * stations[3][1];
999 int pos = offset +
i;
1000 uint16_t bit = (pattern >>
i) & 0x1;
1002 hitPattern[pos >> 4] += bit << ((offset +
i) & (16 - 1));
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
int stripTIBLayersNull() 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 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)
1: Failed selection (without additional info)
bool hasValidHitInFirstPixelEndcap() const
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.
int stripTOBLayersTotallyOffOrBad() const
static const unsigned short minTrackerWord
uint16_t hitPattern[ARRAY_LENGTH]
int stripTIDLayersTotallyOffOrBad() 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
static bool stripHitFilter(uint16_t pattern)
int stripTECLayersTotallyOffOrBad() const
Abs< T >::type abs(const T &t)
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 trackerLayersWithoutMeasurement(HitCategory category) const
bool insertExpectedInnerHit(const uint16_t pattern)
int pixelBarrelLayersTotallyOffOrBad() const
static const unsigned short SubstrMask
static const unsigned short LayerOffset
static int position[264][3]
bool insertTrackHit(const uint16_t pattern)
int stripTECLayersWithMeasurement() const
int stripTECLayersWithoutMeasurement(HitCategory category) const
int pixelEndcapLayersTotallyOffOrBad() 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
bool hasValidHitInFirstPixelBarrel() const
DetId geographicalId() const
static uint32_t getSubSubStructure(uint16_t pattern)
uint16_t getHitPattern(HitCategory category, int position) const
int stripTIBLayersTotallyOffOrBad() const
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 numberOfHits(HitCategory category) const
int stripTIBLayersWithoutMeasurement(HitCategory category) const
bool appendMuonHit(const DetId &id, TrackingRecHit::Type hitType)
int pixelEndcapLayersNull() const