CMS 3D CMS Logo

RPCCosmicSeedrecHitFinder.cc
Go to the documentation of this file.
1 
12 
13 using namespace std;
14 using namespace edm;
15 
16 MuonTransientTrackingRecHit::MuonRecHitContainer::const_iterator find(
17  MuonTransientTrackingRecHit::MuonRecHitContainer::const_iterator firstIter,
18  MuonTransientTrackingRecHit::MuonRecHitContainer::const_iterator lastIter,
20  MuonTransientTrackingRecHit::MuonRecHitContainer::const_iterator index = lastIter;
21  for (MuonTransientTrackingRecHit::MuonRecHitContainer::const_iterator iter = firstIter; iter != lastIter; iter++)
22  if ((*iter) == recHitRef)
23  index = iter;
24  return index;
25 }
26 
28  // Initiate the member
29  isLayerset = false;
30  isConfigured = false;
31  isInputset = false;
32  isOutputset = false;
33  isEdgeset = false;
34  BxRange = 0;
35  MaxDeltaPhi = 0;
36  ClusterSet.clear();
37  innerBounds.clear();
38  isLayersmixed = false;
39  LayersinRPC.clear();
40  therecHits.clear();
41  isOuterLayerfilled = false;
42 }
43 
45 
47  // Set the configuration
48  BxRange = iConfig.getParameter<unsigned int>("BxRange");
49  MaxDeltaPhi = iConfig.getParameter<double>("MaxDeltaPhi");
50  ClusterSet = iConfig.getParameter<std::vector<int> >("ClusterSet");
51 
52  // Set the signal open
53  isConfigured = true;
54 }
55 
57  for (unsigned int i = 0; i < RPCLayerNumber; i++) {
58  AllrecHits[i].clear();
59  AllrecHits[i] = recHits[i];
60  }
61 
62  // Set the signal open
63  isInputset = true;
64 }
65 
67  // Get RPCGeometry
68  edm::ESHandle<RPCGeometry> rpcGeometry;
69  iSetup.get<MuonGeometryRecord>().get(rpcGeometry);
70 
71  // Find all chamber in RB1in and collect their surface
72  const std::vector<DetId> AllRPCId = rpcGeometry->detIds();
73  for (std::vector<DetId>::const_iterator it = AllRPCId.begin(); it != AllRPCId.end(); it++) {
74  RPCDetId RPCId(it->rawId());
75  int Region = RPCId.region();
76  int Station = RPCId.station();
77  int Layer = RPCId.layer();
78  if (Region == 0 && Station == 1 && Layer == 1) {
79  const BoundPlane RPCChamberSurface = rpcGeometry->chamber(RPCId)->surface();
80  innerBounds.push_back(RPCChamberSurface);
81  }
82  }
83 
84  // Set the signal open
85  isEdgeset = true;
86 }
87 
89  // Clear all surfaces of chambers in RB1in
90  innerBounds.clear();
91  isEdgeset = false;
92 }
93 
95  for (unsigned int i = 0; i < RPCLayerNumber; i++)
96  AllrecHits[i].clear();
97  isInputset = false;
98 }
99 
101  theSeed = Seed;
102  // Set the signal open
103  isOutputset = true;
104 }
105 
106 void RPCCosmicSeedrecHitFinder::setLayers(const std::vector<unsigned int>& Layers) {
107  LayersinRPC = Layers;
108  // Set the signal open
109  isLayerset = true;
110 }
111 
113  if (isLayerset == false || isConfigured == false || isOutputset == false || isInputset == false ||
114  isEdgeset == false) {
115  cout << "Not set the IO or not configured yet" << endl;
116  return;
117  }
118 
119  therecHits.clear();
120 
121  if (LayersinRPC.empty()) {
122  cout << "Not set with any layers" << endl;
123  LayersinRPC.clear();
124  therecHits.clear();
125  isLayerset = false;
126  }
127 
128  // check the layers, 1=all barrel, 2=all endcap, 3=mix
129  unsigned int Component = LayerComponent();
130  if (Component == 3)
131  isLayersmixed = true;
132  else
133  isLayersmixed = false;
134 
135  GlobalVector initVector(0, 0, 0);
136  const MuonRecHitPointer recHitRef;
137  isOuterLayerfilled = false;
138  complete(initVector, recHitRef);
139 
140  // Unset the signal
141  LayersinRPC.clear();
142  therecHits.clear();
143  isLayerset = false;
144 }
145 
147  bool isBarrel = false;
148  bool isEndcap = false;
149  for (std::vector<unsigned int>::const_iterator it = LayersinRPC.begin(); it != LayersinRPC.end(); it++) {
150  if ((*it) < BarrelLayerNumber)
151  isBarrel = true;
152  if ((*it) >= BarrelLayerNumber && (*it) < (BarrelLayerNumber + EachEndcapLayerNumber * 2))
153  isEndcap = true;
154  }
155  if (isBarrel == true && isEndcap == true)
156  return 3;
157  if (isEndcap == true)
158  return 2;
159  if (isBarrel == true)
160  return 1;
161  return 0;
162 }
163 
164 bool RPCCosmicSeedrecHitFinder::complete(const GlobalVector& lastSegment, const MuonRecHitPointer& lastrecHitRef) {
165  bool isrecHitsfound = false;
166 
167  for (unsigned int i = 0; i < RPCLayerNumber; i++)
168  for (MuonRecHitContainer::const_iterator it = AllrecHits[i].begin(); it != AllrecHits[i].end(); it++) {
169  cout << "Finding recHits from " << i << " th layer" << endl;
170  // information for recHits
171  GlobalPoint currentPosition = (*it)->globalPosition();
172  int currentBX;
173 
174  // Check validation
175  if (!(*it)->isValid())
176  continue;
177 
178  // Check BX range, be sure there is only RPCRecHit in the MuonRecHitContainer when use the dynamic_cast
179  TrackingRecHit* thisTrackingRecHit = (*it)->hit()->clone();
180  // Should also delete the RPCRecHit object cast by dynamic_cast<> ?
181  RPCRecHit* thisRPCRecHit = dynamic_cast<RPCRecHit*>(thisTrackingRecHit);
182  currentBX = thisRPCRecHit->BunchX();
183  int ClusterSize = thisRPCRecHit->clusterSize();
184  delete thisTrackingRecHit;
185  // Check BX
186  if ((unsigned int)abs(currentBX) > BxRange)
187  continue;
188 
189  // Check cluster size
190  bool Clustercheck = false;
191  if (ClusterSet.empty())
192  Clustercheck = true;
193  for (std::vector<int>::const_iterator CluIter = ClusterSet.begin(); CluIter != ClusterSet.end(); CluIter++)
194  if (ClusterSize == (*CluIter))
195  Clustercheck = true;
196  if (Clustercheck != true)
197  continue;
198 
199  cout << "Candidate recHit's position: " << currentPosition.x() << ", " << currentPosition.y() << ", "
200  << currentPosition.z() << ". BX : " << currentBX << endl;
201  // Fill 1st recHit from outer layers and rest recHits from all layers
202  if (isOuterLayerfilled == false) {
203  // Pick out the recHit from outer layers and fill it
204  if (!isouterLayer(*it))
205  continue;
206 
207  // If pass all, add to the seed
208  GlobalVector currentSegment = GlobalVector(0, 0, 0);
209  cout << "1st recHit's global position: " << currentPosition.x() << ", " << currentPosition.y() << ", "
210  << currentPosition.z() << ". BX: " << currentBX << endl;
211  isrecHitsfound = true;
212  therecHits.push_back(*it);
213  isOuterLayerfilled = true;
214  complete(currentSegment, *it);
215  // Remember to pop the recHit before add another one from the same layer!
216  therecHits.pop_back();
217  isOuterLayerfilled = false;
218  } else {
219  GlobalPoint lastPosition = lastrecHitRef->globalPosition();
220  TrackingRecHit* lastTrackingRecHit = lastrecHitRef->hit()->clone();
221  // Should also delete the RPCRecHit object cast by dynamic_cast<> ?
222  RPCRecHit* lastRPCRecHit = dynamic_cast<RPCRecHit*>(lastTrackingRecHit);
223  int lastBX = lastRPCRecHit->BunchX();
224  delete lastTrackingRecHit;
225 
226  // Check the Y coordinate, shoule be lower than current one
227  if (currentPosition.y() >= lastPosition.y())
228  continue;
229 
230  // Check the BX, should be larger than current one
231  if (currentBX < lastBX)
232  continue;
233 
234  // If be the 2nd recHit, just fill it
235  bool isinsideRegion = isinsideAngleRange(lastSegment, lastPosition, currentPosition);
236  cout << "Check isinsideRegion: " << isinsideRegion << endl;
237  if (!isinsideRegion)
238  continue;
239 
240  // If cross the edge the recHit should belong to another seed
241  bool iscrossanyEdge = iscorssEdge(lastrecHitRef, *it);
242  cout << "Check iscrossanyEdge: " << iscrossanyEdge << endl;
243  if (iscrossanyEdge)
244  continue;
245 
246  // If pass all, add to the seed
247  unsigned int NumberinSeed = therecHits.size();
248  GlobalVector currentSegment = (GlobalVector)(currentPosition - lastPosition);
249  cout << (NumberinSeed + 1) << "th recHit's global position: " << currentPosition.x() << ", "
250  << currentPosition.y() << ", " << currentPosition.z() << ". BX: " << currentBX << endl;
251  isrecHitsfound = true;
252  therecHits.push_back(*it);
253 
254  // if could not find next recHit in the search path, and have enough recHits already, that is the candidate
255  bool findNext = complete(currentSegment, *it);
256  if (findNext == false && therecHits.size() > 3) {
257  for (ConstMuonRecHitContainer::const_iterator iter = therecHits.begin(); iter != therecHits.end(); iter++)
258  cout << "Find recHit in seed candidate : " << (*iter)->globalPosition().x() << ", "
259  << (*iter)->globalPosition().y() << ", " << (*iter)->globalPosition().z() << endl;
260  checkandfill();
261  }
262 
263  // Remember to pop the recHit before add another one from the same layer!
264  therecHits.pop_back();
265  }
266  }
267  return isrecHitsfound;
268 }
269 
271  bool isinsideLayers = false;
272  for (std::vector<unsigned int>::const_iterator it = LayersinRPC.begin(); it != LayersinRPC.end(); it++) {
273  MuonRecHitContainer::const_iterator index = find(AllrecHits[*it].begin(), AllrecHits[*it].end(), recHitRef);
274  if (index != AllrecHits[*it].end())
275  isinsideLayers = true;
276  }
277  return isinsideLayers;
278 }
279 
281  const GlobalPoint& lastPosition,
282  const GlobalPoint& currentPosition) {
283  bool isinsideAngle = true;
284  GlobalVector SegVec = currentPosition - lastPosition;
285  if (lastSegment.mag() != 0)
286  if (fabs((lastSegment.phi() - SegVec.phi()).value()) > MaxDeltaPhi)
287  isinsideAngle = false;
288 
289  return isinsideAngle;
290 }
291 
293  const MuonRecHitPointer& currentrecHitRef) {
294  bool iscorss = false;
295 
296  // Check if 2 recHits corss the inner bounds
297  GlobalPoint lastPosition = lastrecHitRef->globalPosition();
298  GlobalPoint currentPosition = currentrecHitRef->globalPosition();
299  GlobalPoint testPosition((lastPosition.x() + currentPosition.x()) / 2,
300  (lastPosition.y() + currentPosition.y()) / 2,
301  (lastPosition.z() + currentPosition.z()) / 2);
302  /*
303  for(std::vector<BoundPlane>::const_iterator it = innerBounds.begin(); it != innerBounds.end(); it++) {
304  //SurfaceOrientation::Side TestSide0 = it->side(currentPosition, 0);
305  //SurfaceOrientation::Side TestSide1 = it->side(lastPosition, 0);
306  SurfaceOrientation::Side TestSide = it->side(testPosition, 0);
307  //cout << "Side of currentPosition: " << TestSide0 << ", Side of lastPosition: " << TestSide1 << ", Side of middlePosition: " << TestSide << endl;
308  //if(TestSide != SurfaceOrientation::positiveSide)
309  //iscorss = true;
310  }
311  */
312 
313  // Check when mixLayer is not set
314  if (isLayersmixed == false) {
315  DetId lastId = lastrecHitRef->geographicalId();
316  RPCDetId lastRPCId(lastId.rawId());
317  int lastRegion = lastRPCId.region();
318  DetId currentId = currentrecHitRef->geographicalId();
319  RPCDetId currentRPCId(currentId.rawId());
320  int currentRegion = currentRPCId.region();
321  // Check if 2 recHits from different regions
322  if (lastRegion != currentRegion)
323  iscorss = true;
324  }
325 
326  return iscorss;
327 }
328 
330  if (therecHits.size() >= 3) {
331  theSeed->setrecHits(therecHits);
332  theSeed->seed();
333  } else
334  cout << "Layer less than 3, could not fill a RPCSeedFinder" << endl;
335 }
T getParameter(std::string const &) const
void setEdge(const edm::EventSetup &iSetup)
void setInput(MuonRecHitContainer(&recHits)[12])
bool iscorssEdge(const MuonRecHitPointer &lastrecHitRef, const MuonRecHitPointer &currentrecHitRef)
MuonTransientTrackingRecHit::MuonRecHitPointer MuonRecHitPointer
Geom::Phi< T > phi() const
Definition: PV3DBase.h:66
constexpr uint32_t rawId() const
get the raw id
Definition: DetId.h:57
T y() const
Definition: PV3DBase.h:60
MuonTransientTrackingRecHit::MuonRecHitContainer::const_iterator find(MuonTransientTrackingRecHit::MuonRecHitContainer::const_iterator firstIter, MuonTransientTrackingRecHit::MuonRecHitContainer::const_iterator lastIter, const MuonTransientTrackingRecHit::MuonRecHitPointer &recHitRef)
const DetIdContainer & detIds() const override
Returm a vector of all GeomDet DetIds (including those of GeomDetUnits)
Definition: RPCGeometry.cc:28
const Plane & surface() const
The nominal surface of the GeomDet.
Definition: GeomDet.h:37
#define RPCLayerNumber
SeedingLayerSetsHits::SeedingLayer Layer
Definition: LayerTriplets.h:14
int clusterSize() const
Definition: RPCRecHit.h:77
const RPCChamber * chamber(RPCDetId id) const
Definition: RPCGeometry.cc:46
T mag() const
Definition: PV3DBase.h:64
std::shared_ptr< MuonTransientTrackingRecHit > MuonRecHitPointer
bool isinsideAngleRange(const GlobalVector &lastSegment, const GlobalPoint &lastPosition, const GlobalPoint &currentPosition)
void clear(CLHEP::HepGenMatrix &m)
Helper function: Reset all elements of a matrix to 0.
Definition: matutil.cc:151
T z() const
Definition: PV3DBase.h:61
virtual TrackingRecHit * clone() const =0
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
#define end
Definition: vmac.h:39
bool isEndcap(GeomDetEnumerators::SubDetector m)
Definition: DetId.h:17
void setLayers(const std::vector< unsigned int > &Layers)
virtual TrackingRecHit const * hit() const
bool isouterLayer(const MuonRecHitPointer &recHitRef)
#define EachEndcapLayerNumber
#define begin
Definition: vmac.h:32
HLT enums.
T get() const
Definition: EventSetup.h:73
void setOutput(RPCSeedFinder *Seed)
MuonTransientTrackingRecHit::MuonRecHitContainer MuonRecHitContainer
int BunchX() const
Definition: RPCRecHit.h:73
#define BarrelLayerNumber
T x() const
Definition: PV3DBase.h:59
bool complete(const GlobalVector &lastSegment, const MuonRecHitPointer &lastrecHitRef)
Global3DVector GlobalVector
Definition: GlobalVector.h:10
void configure(const edm::ParameterSet &iConfig)
int region() const
Region id: 0 for Barrel, +/-1 For +/- Endcap.
Definition: RPCDetId.h:53