18 using namespace GeomDetEnumerators;
19 using namespace ctfseeding;
26 template<
class T>
inline T sqr(
T t) {
return t*
t;}
44 theLayerCache(*layerCache), theOuterLayer(outer), theInnerLayer(inner)
47 ss =
new std::stringstream;
70 if (innerHitsMap.
empty())
return;
73 if (outerHitsMap.
empty())
return;
81 vector<RecHitsSortedInPhi::Hit> innerHits, outerHits;
82 float outerPhimin, outerPhimax;
83 float innerPhimin, innerPhimax;
87 outerHitsMap.
hits( outerPhimin, outerPhimax, outerHits);
90 (*ss) <<
"\tophimin, ophimax " << outerPhimin <<
" " << outerPhimax << std::endl;
94 for (vector<RecHitsSortedInPhi::Hit>::const_iterator oh = outerHits.begin(); oh!= outerHits.end(); ++oh) {
99 (*ss) <<
"\toPos " << oPos <<
" r " << oPos.
perp() <<
" phi " << oPos.
phi() <<
" cotTheta " << oPos.
z()/oPos.
perp() << std::endl;
116 (*ss) <<
"*******\nNo valid checkRZ\n*******" << std::endl;
124 innerHitsMap.
hits(innerPhimin, innerPhimax, innerHits);
127 (*ss) <<
"\tiphimin, iphimax " << innerPhimin <<
" " << innerPhimax << std::endl;
131 for ( vector<RecHitsSortedInPhi::Hit>::const_iterator ih=innerHits.begin(), ieh = innerHits.end(); ih < ieh; ++ih) {
136 (*ss) <<
"\tinnPos " << innPos <<
" r " << innPos.
perp() <<
" phi " << innPos.
phi() <<
" cotTheta " << innPos.
z()/innPos.
perp() << std::endl;
146 allowed = checkRZ->
range(r_reduced);
147 float zErr = nSigmaRZ * (*ih)->errorGlobalZ();
148 hitRZ =
Range(innPos.
z()-zErr, innPos.
z()+zErr);
150 allowed = checkRZ->
range(innPos.
z());
151 float rErr = nSigmaRZ * (*ih)->errorGlobalR();
152 hitRZ =
Range(r_reduced-rErr, r_reduced+rErr);
158 <<
"\n\t\t allowed Range " << allowed.
min() <<
" \t, " << allowed.max()
159 <<
"\n\t\t hitRz Range " << hitRZ.min() <<
" \t, " << hitRZ.max()
160 <<
"\n\t\t Cross Range " << crossRange.min() <<
" \t, " << crossRange.max()
161 <<
"\n\t\t the seed track has origin " << convRegion.
convPoint() <<
" \t cotTheta " << convRegion.
cotTheta()
165 if (! crossRange.empty() ) {
168 <<
"\n\t\t !!!!ACCEPTED!!! \n\n";
173 edm::LogError(
"TooManySeeds")<<
"number of pairs exceed maximum, no pairs produced";
201 return rLayer + 0.5f*theThickness;
212 float layerZmax = layerZ > 0 ? layerZ+0.5f*theThickness: layerZ-0.5f*theThickness;
223 float minZEndCap=130;
224 if(fabs(convRegion.
convPoint().
z()) > minZEndCap){
226 (*ss) <<
"\tthe conversion seems to be in the endcap. Zconv " << convRegion.
convPoint().
z() << std::endl;
236 (*ss) <<
"\tthis layer is before the conversion : R layer " << R <<
" [ Rconv " << convRegion.
convPoint().
perp() <<
" Zconv " << convRegion.
convPoint().
z()<< std::endl;
244 (*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;
259 (*ss) <<
"\tthis layer is before the conversion : Z layer " << Z <<
" [ Rconv " << convRegion.
convPoint().
perp()<<
" Zconv " << convRegion.
convPoint().
z() << std::endl;
266 if(fabs(Z - convRegion.
convPoint().
z()) > maxSearchZ ){
268 (*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;
304 if(theRCurvatureMin<DeltaL)
305 dphi = atan(DeltaL/layerR);
307 dphi = atan(theRCurvatureMin/layerR * ( 1 -
sqrt(1-
sqr(DeltaL/theRCurvatureMin)) ) );
309 if(convRegion.
charge()>0){
326 Range allowedCotTheta(convRegion.
cotTheta()-nSigmaRZ*sigmaCotTheta,convRegion.
cotTheta()+nSigmaRZ*sigmaCotTheta);
328 double dz = hit->globalPosition().z()-convRegion.
pvtxPoint().
z();
332 float zErr = nSigmaRZ * hit->errorGlobalZ();
335 float rErr = nSigmaRZ * hit->errorGlobalR();
346 <<
"\n\t\t cotTheta allowed Range " << allowedCotTheta.
min() <<
" \t, " << allowedCotTheta.max()
347 <<
"\n\t\t hitCotTheta Range " << hitCotTheta.min() <<
" \t, " << hitCotTheta.max()
348 <<
"\n\t\t Cross Range " << crossRange.min() <<
" \t, " << crossRange.max()
349 <<
"\n\t\t the seed track has origin " << convRegion.
convPoint() <<
" \t cotTheta " << convRegion.
cotTheta()
353 return crossRange.empty();
361 if(dz>0)
return 99999.f;
362 else return -99999.f;
const double Z[kNumberCalorimeter]
HitPairGeneratorFromLayerPairForPhotonConversion(const Layer &inner, const Layer &outer, LayerCacheType *layerCache, unsigned int nSize=30000, unsigned int max=0)
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)
virtual GlobalPoint origin() const =0
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)
const DetLayer * detLayer() const
virtual Range range(const float &rORz) const =0
float getLayerRadius(const DetLayer &layer)
std::vector< Hit > hits(float phiMin, float phiMax) const
GlobalPoint pvtxPoint() const
Geom::Phi< T > phi() const
GlobalPoint convPoint() const
virtual unsigned int size() const
virtual float thickness() const =0
Scalar radius() const
Radius of the cylinder.
const T & max(const T &a, const T &b)
bool getPhiRange(float &Phimin, float &Phimax, const DetLayer &layer, const ConversionRegion &convRegion, const edm::EventSetup &es)
unsigned int theMaxElement
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
*virtual HitRZCompatibility * checkRZ(const DetLayer *layer, const Hit &outerHit, const edm::EventSetup &iSetup) const =0
LayerCacheType & theLayerCache
static const double nSigmaRZ
float getLayerZ(const DetLayer &layer)
double deltaPhi(double phi1, double phi2)
const Bounds & bounds() const
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.
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