17 using namespace GeomDetEnumerators;
24 template<
class T>
inline T sqr(
T t) {
return t*
t;}
42 theLayerCache(*layerCache), theOuterLayer(outer), theInnerLayer(inner)
45 ss =
new std::stringstream;
63 (*ss) <<
"In " << innerLayerObj.
name() <<
" Out " << outerLayerObj.
name() << std::endl;
71 if (innerHitsMap.
empty())
return;
74 if (outerHitsMap.
empty())
return;
82 vector<RecHitsSortedInPhi::Hit> innerHits, outerHits;
83 float outerPhimin, outerPhimax;
84 float innerPhimin, innerPhimax;
88 outerHitsMap.
hits( outerPhimin, outerPhimax, outerHits);
91 (*ss) <<
"\tophimin, ophimax " << outerPhimin <<
" " << outerPhimax << std::endl;
95 for (vector<RecHitsSortedInPhi::Hit>::const_iterator oh = outerHits.begin(); oh!= outerHits.end(); ++oh) {
100 (*ss) <<
"\toPos " << oPos <<
" r " << oPos.
perp() <<
" phi " << oPos.
phi() <<
" cotTheta " << oPos.
z()/oPos.
perp() << std::endl;
117 (*ss) <<
"*******\nNo valid checkRZ\n*******" << std::endl;
124 if(!
getPhiRange(innerPhimin,innerPhimax,*innerLayerObj.
detLayer(),convRegion,es))
continue;
125 innerHitsMap.
hits(innerPhimin, innerPhimax, innerHits);
128 (*ss) <<
"\tiphimin, iphimax " << innerPhimin <<
" " << innerPhimax << std::endl;
132 for ( vector<RecHitsSortedInPhi::Hit>::const_iterator ih=innerHits.begin(), ieh = innerHits.end(); ih < ieh; ++ih) {
137 (*ss) <<
"\tinnPos " << innPos <<
" r " << innPos.
perp() <<
" phi " << innPos.
phi() <<
" cotTheta " << innPos.
z()/innPos.
perp() << std::endl;
147 allowed = checkRZ->
range(r_reduced);
148 float zErr = nSigmaRZ * (*ih)->errorGlobalZ();
149 hitRZ =
Range(innPos.
z()-zErr, innPos.
z()+zErr);
151 allowed = checkRZ->
range(innPos.
z());
152 float rErr = nSigmaRZ * (*ih)->errorGlobalR();
153 hitRZ =
Range(r_reduced-rErr, r_reduced+rErr);
159 <<
"\n\t\t allowed Range " << allowed.
min() <<
" \t, " << allowed.max()
160 <<
"\n\t\t hitRz Range " << hitRZ.min() <<
" \t, " << hitRZ.max()
161 <<
"\n\t\t Cross Range " << crossRange.min() <<
" \t, " << crossRange.max()
162 <<
"\n\t\t the seed track has origin " << convRegion.
convPoint() <<
" \t cotTheta " << convRegion.
cotTheta()
166 if (! crossRange.empty() ) {
169 <<
"\n\t\t !!!!ACCEPTED!!! \n\n";
174 edm::LogError(
"TooManySeeds")<<
"number of pairs exceed maximum, no pairs produced";
202 return rLayer + 0.5f*theThickness;
213 float layerZmax = layerZ > 0 ? layerZ+0.5f*theThickness: layerZ-0.5f*theThickness;
224 float minZEndCap=130;
225 if(fabs(convRegion.
convPoint().
z()) > minZEndCap){
227 (*ss) <<
"\tthe conversion seems to be in the endcap. Zconv " << convRegion.
convPoint().
z() << std::endl;
237 (*ss) <<
"\tthis layer is before the conversion : R layer " << R <<
" [ Rconv " << convRegion.
convPoint().
perp() <<
" Zconv " << convRegion.
convPoint().
z()<< std::endl;
245 (*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;
260 (*ss) <<
"\tthis layer is before the conversion : Z layer " << Z <<
" [ Rconv " << convRegion.
convPoint().
perp()<<
" Zconv " << convRegion.
convPoint().
z() << std::endl;
267 if(fabs(Z - convRegion.
convPoint().
z()) > maxSearchZ ){
269 (*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;
305 if(theRCurvatureMin<DeltaL)
306 dphi = atan(DeltaL/layerR);
308 dphi = atan(theRCurvatureMin/layerR * ( 1 -
sqrt(1-
sqr(DeltaL/theRCurvatureMin)) ) );
310 if(convRegion.
charge()>0){
327 Range allowedCotTheta(convRegion.
cotTheta()-nSigmaRZ*sigmaCotTheta,convRegion.
cotTheta()+nSigmaRZ*sigmaCotTheta);
329 double dz = hit->globalPosition().z()-convRegion.
pvtxPoint().
z();
333 float zErr = nSigmaRZ * hit->errorGlobalZ();
336 float rErr = nSigmaRZ * hit->errorGlobalR();
347 <<
"\n\t\t cotTheta allowed Range " << allowedCotTheta.
min() <<
" \t, " << allowedCotTheta.max()
348 <<
"\n\t\t hitCotTheta Range " << hitCotTheta.min() <<
" \t, " << hitCotTheta.max()
349 <<
"\n\t\t Cross Range " << crossRange.min() <<
" \t, " << crossRange.max()
350 <<
"\n\t\t the seed track has origin " << convRegion.
convPoint() <<
" \t cotTheta " << convRegion.
cotTheta()
354 return crossRange.empty();
362 if(dz>0)
return 99999.f;
363 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
Geom::Phi< T > phi() const
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
const T & max(const T &a, const T &b)
constexpr double nSigmaRZ
bool getPhiRange(float &Phimin, float &Phimax, const DetLayer &layer, const ConversionRegion &convRegion, const edm::EventSetup &es)
Abs< T >::type abs(const T &t)
unsigned int theMaxElement
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
LayerCacheType & theLayerCache
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.
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)
TransientTrackingRecHit::ConstRecHitPointer Hit
HitPairGeneratorFromLayerPairForPhotonConversion(unsigned int inner, unsigned int outer, LayerCacheType *layerCache, unsigned int nSize=30000, unsigned int max=0)
virtual const BoundCylinder & specificSurface() const GCC11_FINAL
Extension of the interface.