1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
|
#include "Alignment/CommonAlignmentProducer/interface/AlignmentCSCOverlapSelector.h"
#include "FWCore/MessageLogger/interface/MessageLogger.h"
#include "FWCore/ParameterSet/interface/ParameterSet.h"
#include "DataFormats/DetId/interface/DetId.h"
#include "DataFormats/MuonDetId/interface/MuonSubdetId.h"
#include "DataFormats/MuonDetId/interface/CSCDetId.h"
#include "DataFormats/TrackingRecHit/interface/TrackingRecHit.h"
#include "DataFormats/TrackingRecHit/interface/TrackingRecHitFwd.h"
// constructor ----------------------------------------------------------------
AlignmentCSCOverlapSelector::AlignmentCSCOverlapSelector(const edm::ParameterSet &iConfig)
: m_station(iConfig.getParameter<int>("station")),
m_minHitsPerChamber(iConfig.getParameter<unsigned int>("minHitsPerChamber")) {
if (m_station == 0) {
edm::LogInfo("AlignmentCSCOverlapSelector")
<< "Acceptable tracks must have " << m_minHitsPerChamber << " in two chambers on all stations." << std::endl;
} else {
edm::LogInfo("AlignmentCSCOverlapSelector") << "Acceptable tracks must have " << m_minHitsPerChamber
<< " in two chambers on station " << m_station << "." << std::endl;
}
}
void AlignmentCSCOverlapSelector::fillPSetDescription(edm::ParameterSetDescription &desc) {
desc.add<int>("station", 1);
desc.add<unsigned int>("minHitsPerChamber", 0);
}
// destructor -----------------------------------------------------------------
AlignmentCSCOverlapSelector::~AlignmentCSCOverlapSelector() {}
// do selection ---------------------------------------------------------------
AlignmentCSCOverlapSelector::Tracks AlignmentCSCOverlapSelector::select(const Tracks &tracks,
const edm::Event &iEvent) const {
Tracks result;
for (auto const &track : tracks) {
unsigned int MEminus4_even = 0;
unsigned int MEminus4_odd = 0;
unsigned int MEminus3_even = 0;
unsigned int MEminus3_odd = 0;
unsigned int MEminus2_even = 0;
unsigned int MEminus2_odd = 0;
unsigned int MEminus1_even = 0;
unsigned int MEminus1_odd = 0;
unsigned int MEplus1_even = 0;
unsigned int MEplus1_odd = 0;
unsigned int MEplus2_even = 0;
unsigned int MEplus2_odd = 0;
unsigned int MEplus3_even = 0;
unsigned int MEplus3_odd = 0;
unsigned int MEplus4_even = 0;
unsigned int MEplus4_odd = 0;
for (auto const &hit : track->recHits()) {
DetId id = hit->geographicalId();
if (id.det() == DetId::Muon && id.subdetId() == MuonSubdetId::CSC) {
CSCDetId cscid(id.rawId());
int station = (cscid.endcap() == 1 ? 1 : -1) * cscid.station();
if (station == -4) {
if (cscid.chamber() % 2 == 0)
MEminus4_even++;
else
MEminus4_odd++;
} else if (station == -3) {
if (cscid.chamber() % 2 == 0)
MEminus3_even++;
else
MEminus3_odd++;
} else if (station == -2) {
if (cscid.chamber() % 2 == 0)
MEminus2_even++;
else
MEminus2_odd++;
} else if (station == -1) {
if (cscid.chamber() % 2 == 0)
MEminus1_even++;
else
MEminus1_odd++;
}
else if (station == 1) {
if (cscid.chamber() % 2 == 0)
MEplus1_even++;
else
MEplus1_odd++;
} else if (station == 2) {
if (cscid.chamber() % 2 == 0)
MEplus2_even++;
else
MEplus2_odd++;
} else if (station == 3) {
if (cscid.chamber() % 2 == 0)
MEplus3_even++;
else
MEplus3_odd++;
} else if (station == 4) {
if (cscid.chamber() % 2 == 0)
MEplus4_even++;
else
MEplus4_odd++;
}
} // end if it's a CSC hit
} // end loop over hits
if ((m_station == 0 || m_station == -4) && (MEminus4_even >= m_minHitsPerChamber) &&
(MEminus4_odd >= m_minHitsPerChamber))
result.push_back(track);
else if ((m_station == 0 || m_station == -3) && (MEminus3_even >= m_minHitsPerChamber) &&
(MEminus3_odd >= m_minHitsPerChamber))
result.push_back(track);
else if ((m_station == 0 || m_station == -2) && (MEminus2_even >= m_minHitsPerChamber) &&
(MEminus2_odd >= m_minHitsPerChamber))
result.push_back(track);
else if ((m_station == 0 || m_station == -1) && (MEminus1_even >= m_minHitsPerChamber) &&
(MEminus1_odd >= m_minHitsPerChamber))
result.push_back(track);
else if ((m_station == 0 || m_station == 1) && (MEplus1_even >= m_minHitsPerChamber) &&
(MEplus1_odd >= m_minHitsPerChamber))
result.push_back(track);
else if ((m_station == 0 || m_station == 2) && (MEplus2_even >= m_minHitsPerChamber) &&
(MEplus2_odd >= m_minHitsPerChamber))
result.push_back(track);
else if ((m_station == 0 || m_station == 3) && (MEplus3_even >= m_minHitsPerChamber) &&
(MEplus3_odd >= m_minHitsPerChamber))
result.push_back(track);
else if ((m_station == 0 || m_station == 4) && (MEplus4_even >= m_minHitsPerChamber) &&
(MEplus4_odd >= m_minHitsPerChamber))
result.push_back(track);
} // end loop over tracks
return result;
}
|