17 using namespace GeomDetEnumerators;
26 template<
class T>
inline T sqr(
T t) {
return t*
t;}
44 theLayerCache(*layerCache), theOuterLayer(outer), theInnerLayer(inner), theMaxElement(max) {
52 auto oldSize = result.
size();
67 ss <<
"In " << innerLayerObj.
name() <<
" Out " << outerLayerObj.
name() << std::endl;
75 if (innerHitsMap.
empty())
return;
78 if (outerHitsMap.
empty())
return;
86 vector<RecHitsSortedInPhi::Hit> innerHits, outerHits;
87 float outerPhimin, outerPhimax;
88 float innerPhimin, innerPhimax;
92 outerHitsMap.
hits( outerPhimin, outerPhimax, outerHits);
95 ss <<
"\tophimin, ophimax " << outerPhimin <<
" " << outerPhimax << std::endl;
99 for (vector<RecHitsSortedInPhi::Hit>::const_iterator oh = outerHits.begin(); oh!= outerHits.end(); ++oh) {
104 ss <<
"\toPos " << oPos <<
" r " << oPos.
perp() <<
" phi " << oPos.
phi() <<
" cotTheta " << oPos.
z()/oPos.
perp() << std::endl;
121 ss <<
"*******\nNo valid checkRZ\n*******" << std::endl;
128 if(!
getPhiRange(innerPhimin,innerPhimax,*innerLayerObj.
detLayer(),convRegion,es))
continue;
129 innerHitsMap.
hits(innerPhimin, innerPhimax, innerHits);
132 ss <<
"\tiphimin, iphimax " << innerPhimin <<
" " << innerPhimax << std::endl;
136 for ( vector<RecHitsSortedInPhi::Hit>::const_iterator ih=innerHits.begin(), ieh = innerHits.end(); ih < ieh; ++ih) {
141 ss <<
"\tinnPos " << innPos <<
" r " << innPos.
perp() <<
" phi " << innPos.
phi() <<
" cotTheta " << innPos.
z()/innPos.
perp() << std::endl;
151 allowed = checkRZ->
range(r_reduced);
152 float zErr = nSigmaRZ * (*ih)->errorGlobalZ();
153 hitRZ =
Range(innPos.
z()-zErr, innPos.
z()+zErr);
155 allowed = checkRZ->
range(innPos.
z());
156 float rErr = nSigmaRZ * (*ih)->errorGlobalR();
157 hitRZ =
Range(r_reduced-rErr, r_reduced+rErr);
163 <<
"\n\t\t allowed Range " << allowed.min() <<
" \t, " << allowed.max()
164 <<
"\n\t\t hitRz Range " << hitRZ.min() <<
" \t, " << hitRZ.max()
165 <<
"\n\t\t Cross Range " << crossRange.min() <<
" \t, " << crossRange.max()
166 <<
"\n\t\t the seed track has origin " << convRegion.
convPoint() <<
" \t cotTheta " << convRegion.
cotTheta()
170 if (! crossRange.empty() ) {
173 <<
"\n\t\t !!!!ACCEPTED!!! \n\n";
176 result.resize(oldSize);
178 edm::LogError(
"TooManySeeds")<<
"number of pairs exceed maximum, no pairs produced";
206 return rLayer + 0.5f*theThickness;
217 float layerZmax = layerZ > 0 ? layerZ+0.5f*theThickness: layerZ-0.5f*theThickness;
228 float minZEndCap=130;
229 if(fabs(convRegion.
convPoint().
z()) > minZEndCap){
231 ss <<
"\tthe conversion seems to be in the endcap. Zconv " << convRegion.
convPoint().
z() << std::endl;
241 ss <<
"\tthis layer is before the conversion : R layer " << R <<
" [ Rconv " << convRegion.
convPoint().
perp() <<
" Zconv " << convRegion.
convPoint().
z()<< std::endl;
249 ss <<
"\tthis layer is far from the conversion more than cut " << maxSearchR <<
" cm. R layer " << R <<
" [ Rconv " << convRegion.
convPoint().
perp() <<
" Zconv " << convRegion.
convPoint().
z()<< std::endl;
264 ss <<
"\tthis layer is before the conversion : Z layer " << Z <<
" [ Rconv " << convRegion.
convPoint().
perp()<<
" Zconv " << convRegion.
convPoint().
z() << std::endl;
271 if(fabs(Z - convRegion.
convPoint().
z()) > maxSearchZ ){
273 ss <<
"\tthis layer is far from the conversion more than cut " << maxSearchZ <<
" cm. Z layer " << Z <<
" [ Rconv " << convRegion.
convPoint().
perp()<<
" Zconv " << convRegion.
convPoint().
z() << std::endl;
309 if(theRCurvatureMin<DeltaL)
310 dphi = atan(DeltaL/layerR);
312 dphi = atan(theRCurvatureMin/layerR * ( 1 -
sqrt(1-
sqr(DeltaL/theRCurvatureMin)) ) );
314 if(convRegion.
charge()>0){
331 Range allowedCotTheta(convRegion.
cotTheta()-nSigmaRZ*sigmaCotTheta,convRegion.
cotTheta()+nSigmaRZ*sigmaCotTheta);
333 double dz = hit->globalPosition().z()-convRegion.
pvtxPoint().
z();
337 float zErr = nSigmaRZ * hit->errorGlobalZ();
340 float rErr = nSigmaRZ * hit->errorGlobalR();
351 <<
"\n\t\t cotTheta allowed Range " << allowedCotTheta.min() <<
" \t, " << allowedCotTheta.max()
352 <<
"\n\t\t hitCotTheta Range " << hitCotTheta.min() <<
" \t, " << hitCotTheta.max()
353 <<
"\n\t\t Cross Range " << crossRange.min() <<
" \t, " << crossRange.max()
354 <<
"\n\t\t the seed track has origin " << convRegion.
convPoint() <<
" \t cotTheta " << convRegion.
cotTheta()
358 return crossRange.empty();
366 if(dz>0)
return 99999.f;
367 else return -99999.f;
const double Z[kNumberCalorimeter]
std::vector< Hit > hits(float phiMin, float phiMax) const
virtual const BoundSurface & surface() const =0
The surface of the GeometricSearchDet.
bool checkRZCompatibilityWithSeedTrack(const RecHitsSortedInPhi::Hit &hit, const DetLayer &layer, const ConversionRegion &convRegion)
double getCot(double dz, double dr)
GlobalPoint const & origin() const
void hitPairs(const ConversionRegion &convRegion, const TrackingRegion ®, OrderedHitPairs &prs, const edm::Event &ev, const edm::EventSetup &es)
virtual Location location() const =0
Which part of the detector (barrel, endcap)
virtual Range range(const float &rORz) const =0
float getLayerRadius(const DetLayer &layer)
GlobalPoint pvtxPoint() const
const unsigned int theMaxElement
Geom::Phi< T > phi() const
SeedingHitSet::ConstRecHitPointer InnerRecHit
GlobalPoint convPoint() const
const Bounds & bounds() const
virtual unsigned int size() const
virtual float thickness() const =0
virtual HitRZCompatibility * checkRZ(const DetLayer *layer, const Hit &outerHit, const edm::EventSetup &iSetup, const DetLayer *outerlayer=0, float lr=0, float gz=0, float dr=0, float dz=0) const =0
bool getPhiRange(float &Phimin, float &Phimax, const DetLayer &layer, const ConversionRegion &convRegion, const edm::EventSetup &es)
Abs< T >::type abs(const T &t)
const std::string & name() const
How EventSelector::AcceptEvent() decides whether to accept an event for output otherwise it is excluding the probing of A single or multiple positive and the trigger will pass if any such matching triggers are PASS or EXCEPTION[A criterion thatmatches no triggers at all is detected and causes a throw.] A single negative with an expectation of appropriate bit checking in the decision and the trigger will pass if any such matching triggers are FAIL or EXCEPTION A wildcarded negative criterion that matches more than one trigger in the trigger but the state exists so we define the behavior If all triggers are the negative crieriion will lead to accepting the event(this again matches the behavior of"!*"before the partial wildcard feature was incorporated).The per-event"cost"of each negative criterion with multiple relevant triggers is about the same as!*was in the past
SeedingHitSet::ConstRecHitPointer Hit
LayerCacheType & theLayerCache
BaseTrackerRecHit const * Hit
float getLayerZ(const DetLayer &layer)
double deltaPhi(double phi1, double phi2)
PixelRecoRange< float > Range
bool checkBoundaries(const DetLayer &layer, const ConversionRegion &convRegion, float maxSearchR, float maxSearchZ)
virtual const Surface::PositionType & position() const
Returns position of the surface.
virtual const BoundCylinder & specificSurface() const
Extension of the interface.
const DetLayer * detLayer() const
T bendingRadius(T pt, const edm::EventSetup &iSetup)
PixelRecoRange< T > intersection(const PixelRecoRange< T > &r) const
Square< F >::type sqr(const F &f)
HitPairGeneratorFromLayerPairForPhotonConversion(unsigned int inner, unsigned int outer, LayerCacheType *layerCache, unsigned int nSize=30000, unsigned int max=0)
SeedingHitSet::ConstRecHitPointer OuterRecHit