CMS 3D CMS Logo

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