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) {
53 auto oldSize = result.
size();
68 ss <<
"In " << innerLayerObj.
name() <<
" Out " << outerLayerObj.
name() << std::endl;
76 if (innerHitsMap.
empty())
return;
79 if (outerHitsMap.
empty())
return;
87 vector<RecHitsSortedInPhi::Hit> innerHits, outerHits;
88 float outerPhimin, outerPhimax;
89 float innerPhimin, innerPhimax;
93 outerHitsMap.
hits( outerPhimin, outerPhimax, outerHits);
96 ss <<
"\tophimin, ophimax " << outerPhimin <<
" " << outerPhimax << std::endl;
100 for (vector<RecHitsSortedInPhi::Hit>::const_iterator oh = outerHits.begin(); oh!= outerHits.end(); ++oh) {
105 ss <<
"\toPos " << oPos <<
" r " << oPos.
perp() <<
" phi " << oPos.
phi() <<
" cotTheta " << oPos.
z()/oPos.
perp() << std::endl;
122 ss <<
"*******\nNo valid checkRZ\n*******" << std::endl;
129 if(!
getPhiRange(innerPhimin,innerPhimax,*innerLayerObj.
detLayer(),convRegion,es))
continue;
130 innerHitsMap.
hits(innerPhimin, innerPhimax, innerHits);
133 ss <<
"\tiphimin, iphimax " << innerPhimin <<
" " << innerPhimax << std::endl;
137 for ( vector<RecHitsSortedInPhi::Hit>::const_iterator ih=innerHits.begin(), ieh = innerHits.end(); ih < ieh; ++ih) {
142 ss <<
"\tinnPos " << innPos <<
" r " << innPos.
perp() <<
" phi " << innPos.
phi() <<
" cotTheta " << innPos.
z()/innPos.
perp() << std::endl;
152 allowed = checkRZ->
range(r_reduced);
153 float zErr = nSigmaRZ * (*ih)->errorGlobalZ();
154 hitRZ =
Range(innPos.
z()-zErr, innPos.
z()+zErr);
156 allowed = checkRZ->
range(innPos.
z());
157 float rErr = nSigmaRZ * (*ih)->errorGlobalR();
158 hitRZ =
Range(r_reduced-rErr, r_reduced+rErr);
164 <<
"\n\t\t allowed Range " << allowed.min() <<
" \t, " << allowed.max()
165 <<
"\n\t\t hitRz Range " << hitRZ.min() <<
" \t, " << hitRZ.max()
166 <<
"\n\t\t Cross Range " << crossRange.min() <<
" \t, " << crossRange.max()
167 <<
"\n\t\t the seed track has origin " << convRegion.
convPoint() <<
" \t cotTheta " << convRegion.
cotTheta()
171 if (! crossRange.empty() ) {
174 <<
"\n\t\t !!!!ACCEPTED!!! \n\n";
177 result.resize(oldSize);
179 edm::LogError(
"TooManySeeds")<<
"number of pairs exceed maximum, no pairs produced";
207 return rLayer + 0.5f*theThickness;
218 float layerZmax = layerZ > 0 ? layerZ+0.5f*theThickness: layerZ-0.5f*theThickness;
229 float minZEndCap=130;
230 if(fabs(convRegion.
convPoint().
z()) > minZEndCap){
232 ss <<
"\tthe conversion seems to be in the endcap. Zconv " << convRegion.
convPoint().
z() << std::endl;
242 ss <<
"\tthis layer is before the conversion : R layer " << R <<
" [ Rconv " << convRegion.
convPoint().
perp() <<
" Zconv " << convRegion.
convPoint().
z()<< std::endl;
250 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;
265 ss <<
"\tthis layer is before the conversion : Z layer " << Z <<
" [ Rconv " << convRegion.
convPoint().
perp()<<
" Zconv " << convRegion.
convPoint().
z() << std::endl;
272 if(fabs(Z - convRegion.
convPoint().
z()) > maxSearchZ ){
274 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;
310 if(theRCurvatureMin<DeltaL)
311 dphi = atan(DeltaL/layerR);
313 dphi = atan(theRCurvatureMin/layerR * ( 1 -
sqrt(1-
sqr(DeltaL/theRCurvatureMin)) ) );
315 if(convRegion.
charge()>0){
332 Range allowedCotTheta(convRegion.
cotTheta()-nSigmaRZ*sigmaCotTheta,convRegion.
cotTheta()+nSigmaRZ*sigmaCotTheta);
334 double dz = hit->globalPosition().z()-convRegion.
pvtxPoint().
z();
338 float zErr = nSigmaRZ * hit->errorGlobalZ();
341 float rErr = nSigmaRZ * hit->errorGlobalR();
352 <<
"\n\t\t cotTheta allowed Range " << allowedCotTheta.min() <<
" \t, " << allowedCotTheta.max()
353 <<
"\n\t\t hitCotTheta Range " << hitCotTheta.min() <<
" \t, " << hitCotTheta.max()
354 <<
"\n\t\t Cross Range " << crossRange.min() <<
" \t, " << crossRange.max()
355 <<
"\n\t\t the seed track has origin " << convRegion.
convPoint() <<
" \t cotTheta " << convRegion.
cotTheta()
359 return crossRange.empty();
367 if(dz>0)
return 99999.f;
368 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)
std::vector< LayerSetAndLayers > layers(const SeedingLayerSetsHits &sets)
GlobalPoint const & origin() const
virtual Location location() const =0
Which part of the detector (barrel, endcap)
virtual Range range(const float &rORz) const =0
PixelRecoRange< float > Range
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
void hitPairs(const ConversionRegion &convRegion, const TrackingRegion ®, OrderedHitPairs &prs, const Layers &layers, const edm::Event &ev, const edm::EventSetup &es)
virtual float thickness() const =0
const unsigned int theInnerLayer
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)
const unsigned int theOuterLayer
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)
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 final
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