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 }
Vector3DBase
Definition: Vector3DBase.h:8
mps_fire.i
i
Definition: mps_fire.py:355
RPCDetId::region
int region() const
Region id: 0 for Barrel, +/-1 For +/- Endcap.
Definition: RPCDetId.h:53
ESHandle.h
PV3DBase::x
T x() const
Definition: PV3DBase.h:59
RPCCosmicSeedrecHitFinder::checkandfill
void checkandfill()
Definition: RPCCosmicSeedrecHitFinder.cc:329
RPCCosmicSeedrecHitFinder::unsetInput
void unsetInput()
Definition: RPCCosmicSeedrecHitFinder.cc:94
edm
HLT enums.
Definition: AlignableModifier.h:19
TrackingRecHit::hit
virtual TrackingRecHit const * hit() const
Definition: TrackingRecHit.h:75
RPCDetId
Definition: RPCDetId.h:16
gather_cfg.cout
cout
Definition: gather_cfg.py:144
RPCRecHit::BunchX
int BunchX() const
Definition: RPCRecHit.h:73
RPCCosmicSeedrecHitFinder.h
GlobalVector
Global3DVector GlobalVector
Definition: GlobalVector.h:10
RPCCosmicSeedrecHitFinder::isinsideAngleRange
bool isinsideAngleRange(const GlobalVector &lastSegment, const GlobalPoint &lastPosition, const GlobalPoint &currentPosition)
Definition: RPCCosmicSeedrecHitFinder.cc:280
RPCCosmicSeedrecHitFinder::setInput
void setInput(MuonRecHitContainer(&recHits)[12])
Definition: RPCCosmicSeedrecHitFinder.cc:56
RPCCosmicSeedrecHitFinder::iscorssEdge
bool iscorssEdge(const MuonRecHitPointer &lastrecHitRef, const MuonRecHitPointer &currentrecHitRef)
Definition: RPCCosmicSeedrecHitFinder.cc:292
RPCCosmicSeedrecHitFinder::isouterLayer
bool isouterLayer(const MuonRecHitPointer &recHitRef)
Definition: RPCCosmicSeedrecHitFinder.cc:270
end
#define end
Definition: vmac.h:39
LayerTriplets::Layer
SeedingLayerSetsHits::SeedingLayer Layer
Definition: LayerTriplets.h:14
RPCGeometry::detIds
const DetIdContainer & detIds() const override
Returm a vector of all GeomDet DetIds (including those of GeomDetUnits)
Definition: RPCGeometry.cc:28
PV3DBase::z
T z() const
Definition: PV3DBase.h:61
DetId
Definition: DetId.h:17
RPCCosmicSeedrecHitFinder::LayerComponent
int LayerComponent()
Definition: RPCCosmicSeedrecHitFinder.cc:146
GeomDet::surface
const Plane & surface() const
The nominal surface of the GeomDet.
Definition: GeomDet.h:37
RPCCosmicSeedrecHitFinder::complete
bool complete(const GlobalVector &lastSegment, const MuonRecHitPointer &lastrecHitRef)
Definition: RPCCosmicSeedrecHitFinder.cc:164
TrackingRecHit.h
MuonTransientTrackingRecHit::MuonRecHitPointer
std::shared_ptr< MuonTransientTrackingRecHit > MuonRecHitPointer
Definition: MuonTransientTrackingRecHit.h:21
RPCLayerNumber
#define RPCLayerNumber
Definition: RPCCosmicSeedrecHitFinder.h:18
edm::EventSetup::get
T get() const
Definition: EventSetup.h:73
RPCRecHit
Definition: RPCRecHit.h:14
edm::ESHandle< RPCGeometry >
RPCSeedFinder
Definition: RPCSeedFinder.h:23
RPCCosmicSeedrecHitFinder::setLayers
void setLayers(const std::vector< unsigned int > &Layers)
Definition: RPCCosmicSeedrecHitFinder.cc:106
Point3DBase< float, GlobalTag >
find
MuonTransientTrackingRecHit::MuonRecHitContainer::const_iterator find(MuonTransientTrackingRecHit::MuonRecHitContainer::const_iterator firstIter, MuonTransientTrackingRecHit::MuonRecHitContainer::const_iterator lastIter, const MuonTransientTrackingRecHit::MuonRecHitPointer &recHitRef)
Definition: RPCCosmicSeedrecHitFinder.cc:16
FastTrackerRecHitMaskProducer_cfi.recHits
recHits
Definition: FastTrackerRecHitMaskProducer_cfi.py:8
PixelPluginsPhase0_cfi.isBarrel
isBarrel
Definition: PixelPluginsPhase0_cfi.py:17
RPCCosmicSeedrecHitFinder::~RPCCosmicSeedrecHitFinder
~RPCCosmicSeedrecHitFinder()
Definition: RPCCosmicSeedrecHitFinder.cc:44
RPCCosmicSeedrecHitFinder::fillrecHits
void fillrecHits()
Definition: RPCCosmicSeedrecHitFinder.cc:112
edm::ParameterSet
Definition: ParameterSet.h:36
clear
void clear(HadCaloObj &c)
Definition: data.h:124
RPCRecHit::clusterSize
int clusterSize() const
Definition: RPCRecHit.h:77
PV3DBase::y
T y() const
Definition: PV3DBase.h:60
PixelTestBeamValidation_cfi.ClusterSize
ClusterSize
Definition: PixelTestBeamValidation_cfi.py:72
g4SimHits_cfi.Region
Region
Definition: g4SimHits_cfi.py:143
edm::EventSetup
Definition: EventSetup.h:57
get
#define get
TrackingRecHit::clone
virtual TrackingRecHit * clone() const =0
RPCCosmicSeedrecHitFinder::unsetEdge
void unsetEdge()
Definition: RPCCosmicSeedrecHitFinder.cc:88
TrackingRecHit
Definition: TrackingRecHit.h:21
PV3DBase::mag
T mag() const
Definition: PV3DBase.h:64
edm::ParameterSet::getParameter
T getParameter(std::string const &) const
RPCGeometry::chamber
const RPCChamber * chamber(RPCDetId id) const
Definition: RPCGeometry.cc:46
std
Definition: JetResolutionObject.h:76
DetId::rawId
constexpr uint32_t rawId() const
get the raw id
Definition: DetId.h:57
RPCCosmicSeedrecHitFinder::RPCCosmicSeedrecHitFinder
RPCCosmicSeedrecHitFinder()
Definition: RPCCosmicSeedrecHitFinder.cc:27
RPCCosmicSeedrecHitFinder::setOutput
void setOutput(RPCSeedFinder *Seed)
Definition: RPCCosmicSeedrecHitFinder.cc:100
relativeConstraints.value
value
Definition: relativeConstraints.py:53
BoundPlane
EachEndcapLayerNumber
#define EachEndcapLayerNumber
Definition: RPCCosmicSeedrecHitFinder.h:26
RPCRecHit.h
RPCCosmicSeedrecHitFinder::configure
void configure(const edm::ParameterSet &iConfig)
Definition: RPCCosmicSeedrecHitFinder.cc:46
BarrelLayerNumber
#define BarrelLayerNumber
Definition: RPCCosmicSeedrecHitFinder.h:22
RPCBxOrConfig_cff.lastBX
lastBX
Definition: RPCBxOrConfig_cff.py:4
AlignmentPI::index
index
Definition: AlignmentPayloadInspectorHelper.h:46
RPCCosmicSeedrecHitFinder::MuonRecHitPointer
MuonTransientTrackingRecHit::MuonRecHitPointer MuonRecHitPointer
Definition: RPCCosmicSeedrecHitFinder.h:30
funct::abs
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
MuonGeometryRecord.h
RPCCosmicSeedrecHitFinder::MuonRecHitContainer
MuonTransientTrackingRecHit::MuonRecHitContainer MuonRecHitContainer
Definition: RPCCosmicSeedrecHitFinder.h:32
GeomDetEnumerators::isEndcap
bool isEndcap(GeomDetEnumerators::SubDetector m)
Definition: GeomDetEnumerators.cc:62
MuonGeometryRecord
Definition: MuonGeometryRecord.h:34
RPCGeometry.h
begin
#define begin
Definition: vmac.h:32
PV3DBase::phi
Geom::Phi< T > phi() const
Definition: PV3DBase.h:66
RPCCosmicSeedrecHitFinder::setEdge
void setEdge(const edm::EventSetup &iSetup)
Definition: RPCCosmicSeedrecHitFinder.cc:66