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;
constexpr double deltaPhi(double phi1, double phi2)
std::vector< Hit > hits(float phiMin, float phiMax) const
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
PixelRecoRange< float > Range
float getLayerRadius(const DetLayer &layer)
GlobalPoint pvtxPoint() const
const unsigned int theMaxElement
virtual Location location() const =0
Which part of the detector (barrel, endcap)
Geom::Phi< T > phi() const
SeedingHitSet::ConstRecHitPointer InnerRecHit
GlobalPoint convPoint() const
const Bounds & bounds() const
virtual const BoundCylinder & specificSurface() const final
Extension of the interface.
void hitPairs(const ConversionRegion &convRegion, const TrackingRegion ®, OrderedHitPairs &prs, const Layers &layers, const edm::Event &ev, const edm::EventSetup &es)
const unsigned int theInnerLayer
virtual Range range(const float &rORz) const =0
bool getPhiRange(float &Phimin, float &Phimax, const DetLayer &layer, const ConversionRegion &convRegion, const edm::EventSetup &es)
unsigned int size() const override
const unsigned int theOuterLayer
Abs< T >::type abs(const T &t)
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
virtual const BoundSurface & surface() const =0
The surface of the GeometricSearchDet.
const std::string & name() const
SeedingHitSet::ConstRecHitPointer Hit
LayerCacheType & theLayerCache
BaseTrackerRecHit const * Hit
float getLayerZ(const DetLayer &layer)
bool checkBoundaries(const DetLayer &layer, const ConversionRegion &convRegion, float maxSearchR, float maxSearchZ)
virtual float thickness() const =0
virtual const Surface::PositionType & position() const
Returns position of the surface.
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