#include <RecoTracker/SpecialSeedGenerators/interface/SimpleCosmicBONSeeder.h>
Definition at line 38 of file SimpleCosmicBONSeeder.h.
SimpleCosmicBONSeeder::SimpleCosmicBONSeeder | ( | const edm::ParameterSet & | conf | ) | [explicit] |
Definition at line 17 of file SimpleCosmicBONSeeder.cc.
References builderName, chargeThresholds_, checkCharge_, checkMaxHitsPerModule_, conf_, edm::ParameterSet::existsAs(), edm::ParameterSet::getParameter(), goodHitsPerSeed_, layerTripletNames_, matchedRecHitUsesAnd_, max, maxHitsPerModule_, negativeYOnly, pMin_, positiveYOnly, ptmin, region_, StripSubdetector::TEC, StripSubdetector::TIB, StripSubdetector::TID, StripSubdetector::TOB, and writeTriplets_.
00017 : 00018 conf_(conf), 00019 theLsb(conf.getParameter<edm::ParameterSet>("TripletsPSet")), 00020 writeTriplets_(conf.getParameter<bool>("writeTriplets")), 00021 seedOnMiddle_(conf.existsAs<bool>("seedOnMiddle") ? conf.getParameter<bool>("seedOnMiddle") : false), 00022 rescaleError_(conf.existsAs<double>("rescaleError") ? conf.getParameter<double>("rescaleError") : 1.0), 00023 tripletsVerbosity_(conf.getParameter<edm::ParameterSet>("TripletsPSet").getUntrackedParameter<uint32_t>("debugLevel",0)), 00024 seedVerbosity_(conf.getUntrackedParameter<uint32_t>("seedDebugLevel",0)), 00025 helixVerbosity_(conf.getUntrackedParameter<uint32_t>("helixDebugLevel",0)), 00026 check_(conf.getParameter<edm::ParameterSet>("ClusterCheckPSet")), 00027 maxTriplets_(conf.getParameter<int32_t>("maxTriplets")), 00028 maxSeeds_(conf.getParameter<int32_t>("maxSeeds")) 00029 { 00030 edm::ParameterSet regionConf = conf_.getParameter<edm::ParameterSet>("RegionPSet"); 00031 float ptmin = regionConf.getParameter<double>("ptMin"); 00032 float originradius = regionConf.getParameter<double>("originRadius"); 00033 float halflength = regionConf.getParameter<double>("originHalfLength"); 00034 float originz = regionConf.getParameter<double>("originZPosition"); 00035 region_ = GlobalTrackingRegion(ptmin, originradius, halflength, originz); 00036 pMin_ = regionConf.getParameter<double>("pMin"); 00037 00038 builderName = conf_.getParameter<std::string>("TTRHBuilder"); 00039 00040 //***top-bottom 00041 positiveYOnly=conf_.getParameter<bool>("PositiveYOnly"); 00042 negativeYOnly=conf_.getParameter<bool>("NegativeYOnly"); 00043 //*** 00044 00045 produces<TrajectorySeedCollection>(); 00046 if (writeTriplets_) produces<edm::OwnVector<TrackingRecHit> >("cosmicTriplets"); 00047 00048 layerTripletNames_ = conf_.getParameter<edm::ParameterSet>("TripletsPSet").getParameter<std::vector<std::string> >("layerList"); 00049 00050 if (conf.existsAs<edm::ParameterSet>("ClusterChargeCheck")) { 00051 edm::ParameterSet cccc = conf.getParameter<edm::ParameterSet>("ClusterChargeCheck"); 00052 checkCharge_ = cccc.getParameter<bool>("checkCharge"); 00053 matchedRecHitUsesAnd_ = cccc.getParameter<bool>("matchedRecHitsUseAnd"); 00054 chargeThresholds_.resize(7,0); 00055 edm::ParameterSet ccct = cccc.getParameter<edm::ParameterSet>("Thresholds"); 00056 chargeThresholds_[StripSubdetector::TIB] = ccct.getParameter<int32_t>("TIB"); 00057 chargeThresholds_[StripSubdetector::TID] = ccct.getParameter<int32_t>("TID"); 00058 chargeThresholds_[StripSubdetector::TOB] = ccct.getParameter<int32_t>("TOB"); 00059 chargeThresholds_[StripSubdetector::TEC] = ccct.getParameter<int32_t>("TEC"); 00060 } else { 00061 checkCharge_ = false; 00062 } 00063 if (conf.existsAs<edm::ParameterSet>("HitsPerModuleCheck")) { 00064 edm::ParameterSet hpmcc = conf.getParameter<edm::ParameterSet>("HitsPerModuleCheck"); 00065 checkMaxHitsPerModule_ = hpmcc.getParameter<bool>("checkHitsPerModule"); 00066 maxHitsPerModule_.resize(7,std::numeric_limits<int32_t>::max()); 00067 edm::ParameterSet hpmct = hpmcc.getParameter<edm::ParameterSet>("Thresholds"); 00068 maxHitsPerModule_[StripSubdetector::TIB] = hpmct.getParameter<int32_t>("TIB"); 00069 maxHitsPerModule_[StripSubdetector::TID] = hpmct.getParameter<int32_t>("TID"); 00070 maxHitsPerModule_[StripSubdetector::TOB] = hpmct.getParameter<int32_t>("TOB"); 00071 maxHitsPerModule_[StripSubdetector::TEC] = hpmct.getParameter<int32_t>("TEC"); 00072 } else { 00073 checkMaxHitsPerModule_ = false; 00074 } 00075 if (checkCharge_ || checkMaxHitsPerModule_) { 00076 goodHitsPerSeed_ = conf.getParameter<int32_t>("minimumGoodHitsInSeed"); 00077 } else { 00078 goodHitsPerSeed_ = 0; 00079 } 00080 00081 }
virtual SimpleCosmicBONSeeder::~SimpleCosmicBONSeeder | ( | ) | [inline, virtual] |
bool SimpleCosmicBONSeeder::checkCharge | ( | const SiStripRecHit2D & | hit, | |
int | subdetid | |||
) | const [private] |
Definition at line 327 of file SimpleCosmicBONSeeder.cc.
References SiStripCluster::amplitudes(), TestMuL1L2Filter_cff::cerr, chargeThresholds_, SiStripRecHit2D::cluster(), SiStripRecHit2D::cluster_regional(), lat::endl(), SiStripCluster::firstStrip(), TrackingRecHit::geographicalId(), int, DetId::rawId(), and tripletsVerbosity_.
00327 { 00328 const SiStripCluster *clust = (hit.cluster().isNonnull() ? hit.cluster().get() : hit.cluster_regional().get()); 00329 int charge = std::accumulate(clust->amplitudes().begin(), clust->amplitudes().end(), int(0)); 00330 if (tripletsVerbosity_ > 1) { 00331 std::cerr << "Hit on " << subdetid << ", charge = " << charge << ", threshold = " << chargeThresholds_[subdetid] 00332 << ", detid = " << hit.geographicalId().rawId() << ", firstStrip = " << clust->firstStrip() << std::endl; 00333 } else if ((tripletsVerbosity_ == 1) && (charge < chargeThresholds_[subdetid])) { 00334 std::cerr << "Hit on " << subdetid << ", charge = " << charge << ", threshold = " << chargeThresholds_[subdetid] 00335 << ", detid = " << hit.geographicalId().rawId() << ", firstStrip = " << clust->firstStrip() << std::endl; 00336 } 00337 return charge > chargeThresholds_[subdetid]; 00338 }
bool SimpleCosmicBONSeeder::checkCharge | ( | const TrackingRecHit * | hit | ) | const [private] |
Definition at line 306 of file SimpleCosmicBONSeeder.cc.
References TrackingRecHit::geographicalId(), matchedRecHitUsesAnd_, SiStripMatchedRecHit2D::monoHit(), SiStripMatchedRecHit2D::stereoHit(), and DetId::Tracker.
Referenced by triplets().
00306 { 00307 DetId detid(hit->geographicalId()); 00308 if (detid.det() != DetId::Tracker) return false; // should not happen 00309 int subdet = detid.subdetId(); 00310 if (subdet < 3) { // pixel 00311 return true; 00312 } else { 00313 if (typeid(*hit) == typeid(SiStripMatchedRecHit2D)) { 00314 const SiStripMatchedRecHit2D *mhit = static_cast<const SiStripMatchedRecHit2D *>(hit); 00315 if (matchedRecHitUsesAnd_) { 00316 return checkCharge(*mhit->monoHit(), subdet) && checkCharge(*mhit->stereoHit(), subdet); 00317 } else { 00318 return checkCharge(*mhit->monoHit(), subdet) || checkCharge(*mhit->stereoHit(), subdet); 00319 } 00320 } else if (typeid(*hit) == typeid(SiStripRecHit2D)) { 00321 return checkCharge(static_cast<const SiStripRecHit2D &>(*hit), subdet); 00322 } else { 00323 return true; 00324 } 00325 } 00326 }
void SimpleCosmicBONSeeder::checkNoisyModules | ( | const std::vector< TransientTrackingRecHit::RecHitPointer > & | hits, | |
std::vector< bool > & | oks | |||
) | const [private] |
Definition at line 340 of file SimpleCosmicBONSeeder.cc.
References TestMuL1L2Filter_cff::cerr, end, lat::endl(), edm::pset::fill(), it, maxHitsPerModule_, min, DetId::rawId(), DetId::subdetId(), and tripletsVerbosity_.
Referenced by triplets().
00340 { 00341 typedef TransientTrackingRecHit::RecHitPointer TTRH; 00342 std::vector<TTRH>::const_iterator it = hits.begin(), start = it, end = hits.end(); 00343 std::vector<bool>::iterator ok = oks.begin(), okStart = ok, okEnd = oks.end(); 00344 while (start < end) { 00345 DetId lastid = (*start)->geographicalId(); 00346 for (it = start + 1; (it < end) && ((*it)->geographicalId() == lastid); ++it) { 00347 ++ok; 00348 } 00349 if ( (it - start) > maxHitsPerModule_[lastid.subdetId()] ) { 00350 if (tripletsVerbosity_ > 0) { 00351 std::cerr << "SimpleCosmicBONSeeder: Marking noisy module " << lastid.rawId() << ", it has " << (it-start) << " rechits" 00352 << " (threshold is " << maxHitsPerModule_[lastid.subdetId()] << ")" << std::endl; 00353 } 00354 std::fill(okStart,ok,false); 00355 } else if (tripletsVerbosity_ > 0) { 00356 if ( (it - start) > std::min(4,maxHitsPerModule_[lastid.subdetId()]/4) ) { 00357 std::cerr << "SimpleCosmicBONSeeder: Not marking noisy module " << lastid.rawId() << ", it has " << (it-start) << " rechits" 00358 << " (threshold is " << maxHitsPerModule_[lastid.subdetId()] << ")" << std::endl; 00359 } 00360 } 00361 start = it; okStart = ok; 00362 } 00363 }
Definition at line 603 of file SimpleCosmicBONSeeder.cc.
References thePropagatorAl, thePropagatorOp, and theUpdator.
Referenced by produce().
00603 { 00604 delete thePropagatorAl; 00605 delete thePropagatorOp; 00606 delete theUpdator; 00607 }
bool SimpleCosmicBONSeeder::goodTriplet | ( | const GlobalPoint & | inner, | |
const GlobalPoint & | middle, | |||
const GlobalPoint & | outer, | |||
const double & | minRho | |||
) | const |
Definition at line 365 of file SimpleCosmicBONSeeder.cc.
References GenMuonPlsPt100GeV_cfg::cout, lat::endl(), FastCircle::rho(), tripletsVerbosity_, PV3DBase< T, PVType, FrameType >::y(), and PV3DBase< T, PVType, FrameType >::z().
Referenced by triplets().
00365 { 00366 float dyOM = outer.y() - middle.y(), dyIM = inner.y() - middle.y(); 00367 if ((dyOM * dyIM > 0) && (fabs(dyOM)>10) && (fabs(dyIM)>10)) { 00368 if (tripletsVerbosity_ > 2) std::cout << " fail for non coherent dy" << std::endl; 00369 return false; 00370 } 00371 float dzOM = outer.z() - middle.z(), dzIM = inner.z() - middle.z(); 00372 if ((dzOM * dzIM > 0) && (fabs(dzOM)>50) && (fabs(dzIM)>50)) { 00373 if (tripletsVerbosity_ > 2) std::cout << " fail for non coherent dz" << std::endl; 00374 return false; 00375 } 00376 if (minRho > 0) { 00377 FastCircle theCircle(inner,middle,outer); 00378 if (theCircle.rho() < minRho) { 00379 if (tripletsVerbosity_ > 2) std::cout << " fail for pt cut" << std::endl; 00380 return false; 00381 } 00382 } 00383 return true; 00384 }
void SimpleCosmicBONSeeder::init | ( | const edm::EventSetup & | c | ) |
Definition at line 124 of file SimpleCosmicBONSeeder.cc.
References alongMomentum, builderName, edm::EventSetup::get(), magfield, oppositeToMomentum, thePropagatorAl, thePropagatorOp, theUpdator, tracker, and TTTRHBuilder.
Referenced by produce().
00125 { 00126 iSetup.get<TrackerDigiGeometryRecord>().get(tracker); 00127 iSetup.get<TransientRecHitRecord>().get(builderName,TTTRHBuilder); 00128 00129 // FIXME: these should come from ES too!! 00130 thePropagatorAl = new PropagatorWithMaterial(alongMomentum,0.1057,&(*magfield) ); 00131 thePropagatorOp = new PropagatorWithMaterial(oppositeToMomentum,0.1057,&(*magfield) ); 00132 theUpdator = new KFUpdator(); 00133 00134 }
std::pair< GlobalVector, int > SimpleCosmicBONSeeder::pqFromHelixFit | ( | const GlobalPoint & | inner, | |
const GlobalPoint & | middle, | |||
const GlobalPoint & | outer, | |||
const edm::EventSetup & | iSetup | |||
) | const |
Definition at line 387 of file SimpleCosmicBONSeeder.cc.
References funct::abs(), GlobalTrajectoryParameters::charge(), GenMuonPlsPt100GeV_cfg::cout, lat::endl(), helixVerbosity_, magfield, GlobalTrajectoryParameters::momentum(), FreeTrajectoryState::parameters(), FastCircle::rho(), rho, FastHelix::stateAtVertex(), PV3DBase< T, PVType, FrameType >::x(), FastCircle::x0(), PV3DBase< T, PVType, FrameType >::y(), FastCircle::y0(), and PV3DBase< T, PVType, FrameType >::z().
Referenced by seeds(), and triplets().
00388 { 00389 if (helixVerbosity_ > 0) { 00390 std::cout << "DEBUG PZ =====" << std::endl; 00391 FastHelix helix(inner,middle,outer,iSetup); 00392 GlobalVector gv=helix.stateAtVertex().parameters().momentum(); // status on inner hit 00393 std::cout << "FastHelix P = " << gv << "\n"; 00394 std::cout << "FastHelix Q = " << helix.stateAtVertex().parameters().charge() << "\n"; 00395 } 00396 00397 // My attempt (with different approx from FastHelix) 00398 // 1) fit the circle 00399 FastCircle theCircle(inner,middle,outer); 00400 double rho = theCircle.rho(); 00401 00402 // 2) Get the PT 00403 GlobalVector tesla = magfield->inTesla(middle); 00404 double pt = 0.01 * rho * (0.3*tesla.z()); 00405 00406 // 3) Get the PX,PY at OUTER hit (VERTEX) 00407 double dx1 = outer.x()-theCircle.x0(); 00408 double dy1 = outer.y()-theCircle.y0(); 00409 double py = pt*dx1/rho, px = -pt*dy1/rho; 00410 if(px*(middle.x() - outer.x()) + py*(middle.y() - outer.y()) < 0.) { 00411 px *= -1.; py *= -1.; 00412 } 00413 00414 // 4) Get the PZ through pz = pT*(dz/d(R*phi))) 00415 double dz = inner.z() - outer.z(); 00416 double sinphi = ( dx1*(inner.y()-theCircle.y0()) - dy1*(inner.x()-theCircle.x0())) / (rho * rho); 00417 double dphi = std::abs(std::asin(sinphi)); 00418 double pz = pt * dz / (dphi * rho); 00419 00420 int myq = ((theCircle.x0()*py - theCircle.y0()*px) / tesla.z()) > 0. ? +1 : -1; 00421 00422 std::pair<GlobalVector,int> mypq(GlobalVector(px,py,pz),myq); 00423 00424 if (helixVerbosity_ > 1) { 00425 std::cout << "Gio: pt = " << pt << std::endl; 00426 std::cout << "Gio: dz = " << dz << ", sinphi = " << sinphi << ", dphi = " << dphi << ", dz/drphi = " << (dz/dphi/rho) << std::endl; 00427 } 00428 if (helixVerbosity_ > 0) { 00429 std::cout << "Gio's fit P = " << mypq.first << "\n"; 00430 std::cout << "Gio's fit Q = " << myq << "\n"; 00431 } 00432 00433 return mypq; 00434 }
void SimpleCosmicBONSeeder::produce | ( | edm::Event & | e, | |
const edm::EventSetup & | c | |||
) | [virtual] |
Implements edm::EDProducer.
Definition at line 84 of file SimpleCosmicBONSeeder.cc.
References check_, TrackingRecHit::clone(), done(), edm::EventSetup::get(), hitTriplets, init(), it, magfield, output(), edm::Event::put(), seeds(), ClusterChecker::tooManyClusters(), triplets(), and writeTriplets_.
00085 { 00086 std::auto_ptr<TrajectorySeedCollection> output(new TrajectorySeedCollection()); 00087 std::auto_ptr<edm::OwnVector<TrackingRecHit> > outtriplets(new edm::OwnVector<TrackingRecHit>()); 00088 00089 es.get<IdealMagneticFieldRecord>().get(magfield); 00090 if (magfield->inTesla(GlobalPoint(0,0,0)).mag() > 0.01) { 00091 size_t clustsOrZero = check_.tooManyClusters(ev); 00092 if (clustsOrZero) { 00093 edm::LogWarning("SimpleCosmicBONSeeder") << "Found too many clusters (" << clustsOrZero << "), bailing out.\n"; 00094 } else { 00095 init(es); 00096 bool tripletsOk = triplets(ev,es); 00097 if (tripletsOk) { 00098 00099 bool seedsOk = seeds(*output,es); 00100 if (!seedsOk) { } 00101 00102 if (writeTriplets_) { 00103 for (OrderedHitTriplets::const_iterator it = hitTriplets.begin(); it != hitTriplets.end(); ++it) { 00104 const TrackingRecHit * hit1 = it->inner(); 00105 const TrackingRecHit * hit2 = it->middle(); 00106 const TrackingRecHit * hit3 = it->outer(); 00107 outtriplets->push_back(hit1->clone()); 00108 outtriplets->push_back(hit2->clone()); 00109 outtriplets->push_back(hit3->clone()); 00110 } 00111 } 00112 } 00113 done(); 00114 } 00115 } 00116 00117 if (writeTriplets_) { 00118 ev.put(outtriplets, "cosmicTriplets"); 00119 } 00120 ev.put(output); 00121 }
bool SimpleCosmicBONSeeder::seeds | ( | TrajectorySeedCollection & | output, | |
const edm::EventSetup & | iSetup | |||
) |
Definition at line 436 of file SimpleCosmicBONSeeder.cc.
References alongMomentum, TrajectoryStateOnSurface::cartesianError(), FreeTrajectoryState::cartesianError(), TrajectoryStateOnSurface::charge(), GenMuonPlsPt100GeV_cfg::cout, lat::endl(), PV3DBase< T, PVType, FrameType >::eta(), cmsPerfPublish::fail(), TrajectoryStateOnSurface::globalMomentum(), TrajectoryStateOnSurface::globalPosition(), hitTriplets, SurfaceOrientation::inner, OrderedHitTriplet::inner(), edm::isnan(), TrajectoryStateOnSurface::isValid(), it, PV3DBase< T, PVType, FrameType >::mag(), magfield, CartesianTrajectoryError::matrix(), maxSeeds_, OrderedHitTriplet::middle(), middle, oppositeToMomentum, SurfaceOrientation::outer, OrderedHitTriplet::outer(), PV3DBase< T, PVType, FrameType >::perp(), TrajectoryStateTransform::persistentState(), PV3DBase< T, PVType, FrameType >::phi(), pMin_, pq, pqFromHelixFit(), Propagator::propagate(), TrackingRegionBase::ptMin(), edm::OwnVector< T, P >::push_back(), region_, FreeTrajectoryState::rescaleError(), TrajectoryStateOnSurface::rescaleError(), rescaleError_, seedOnMiddle_, seedVerbosity_, OrderedHitTriplets::size(), funct::sqrt(), std::swap(), thePropagatorAl, thePropagatorOp, theUpdator, tracker, transformer, KFUpdator::update(), PV3DBase< T, PVType, FrameType >::x(), PV3DBase< T, PVType, FrameType >::y(), and PV3DBase< T, PVType, FrameType >::z().
Referenced by produce().
00437 { 00438 typedef TrajectoryStateOnSurface TSOS; 00439 00440 for (size_t it=0;it<hitTriplets.size();it++){ 00441 const OrderedHitTriplet &trip = hitTriplets[it]; 00442 00443 GlobalPoint inner = tracker->idToDet((*(trip.inner())).geographicalId())->surface(). 00444 toGlobal((*(trip.inner())).localPosition()); 00445 00446 GlobalPoint middle = tracker->idToDet((*(trip.middle())).geographicalId())->surface(). 00447 toGlobal((*(trip.middle())).localPosition()); 00448 00449 GlobalPoint outer = tracker->idToDet((*(trip.outer())).geographicalId())->surface(). 00450 toGlobal((*(trip.outer())).localPosition()); 00451 00452 if (seedVerbosity_ > 1) 00453 std::cout << "Processing triplet " << it << ": " << inner << " + " << middle << " + " << outer << std::endl; 00454 00455 if ( (outer.y()-inner.y())*outer.y() < 0 ) { 00456 std::swap(inner,outer); 00457 std::swap(const_cast<ctfseeding::SeedingHit &>(trip.inner()), 00458 const_cast<ctfseeding::SeedingHit &>(trip.outer()) ); 00459 if (seedVerbosity_ > 1) { 00460 std::cout << "The seed was going away from CMS! swapped in <-> out" << std::endl; 00461 std::cout << "Processing swapped triplet " << it << ": " << inner << " + " << middle << " + " << outer << std::endl; 00462 } 00463 } 00464 00465 // First use FastHelix out of the box 00466 std::pair<GlobalVector,int> pq = pqFromHelixFit(inner,middle,outer,iSetup); 00467 GlobalVector gv = pq.first; 00468 float ch = pq.second; 00469 float Mom = sqrt( gv.x()*gv.x() + gv.y()*gv.y() + gv.z()*gv.z() ); 00470 00471 if(Mom > 10000 || isnan(Mom)) { 00472 if (seedVerbosity_ > 1) 00473 std::cout << "Processing triplet " << it << ": fail for momentum." << std::endl; 00474 continue; 00475 } 00476 00477 if (gv.perp() < region_.ptMin()) { 00478 if (seedVerbosity_ > 1) 00479 std::cout << "Processing triplet " << it << ": fail for pt = " << gv.perp() << " < ptMin = " << region_.ptMin() << std::endl; 00480 continue; 00481 } 00482 00483 const Propagator * propagator = 0; 00484 if((outer.y()-inner.y())>0){ 00485 if (seedVerbosity_ > 1) 00486 std::cout << "Processing triplet " << it << ": downgoing." << std::endl; 00487 propagator = thePropagatorAl; 00488 } else { 00489 gv = -1*gv; ch = -1.*ch; 00490 propagator = thePropagatorOp; 00491 if (seedVerbosity_ > 1) 00492 std::cout << "Processing triplet " << it << ": upgoing." << std::endl; 00493 } 00494 00495 if (seedVerbosity_ > 1) { 00496 if (( gv.z() * (outer.z()-inner.z()) > 0 ) && ( fabs(outer.z()-inner.z()) > 5) && (fabs(gv.z()) > .01)) { 00497 std::cout << "ORRORE: outer.z()-inner.z() = " << (outer.z()-inner.z()) << ", gv.z() = " << gv.z() << std::endl; 00498 } 00499 } 00500 00501 GlobalTrajectoryParameters Gtp(outer, 00502 gv,int(ch), 00503 &(*magfield)); 00504 FreeTrajectoryState CosmicSeed(Gtp, 00505 CurvilinearTrajectoryError(AlgebraicSymMatrix55(AlgebraicMatrixID()))); 00506 CosmicSeed.rescaleError(100); 00507 if (seedVerbosity_ > 2) { 00508 std::cout << "Processing triplet " << it << ". start from " << std::endl; 00509 std::cout << " X = " << outer << ", P = " << gv << std::endl; 00510 std::cout << " Cartesian error (X,P) = \n" << CosmicSeed.cartesianError().matrix() << std::endl; 00511 } 00512 00513 edm::OwnVector<TrackingRecHit> hits; 00514 OrderedHitTriplet::Hits seedHits; 00515 seedHits.push_back(trip.outer()); 00516 seedHits.push_back(trip.middle()); 00517 seedHits.push_back(trip.inner()); 00518 TSOS propagated, updated; 00519 bool fail = false; 00520 for (size_t ih = 0; ih < 3; ++ih) { 00521 if ((ih == 2) && seedOnMiddle_) { 00522 if (seedVerbosity_ > 2) 00523 std::cout << "Stopping at middle hit, as requested." << std::endl; 00524 break; 00525 } 00526 if (seedVerbosity_ > 2) 00527 std::cout << "Processing triplet " << it << ", hit " << ih << "." << std::endl; 00528 if (ih == 0) { 00529 propagated = propagator->propagate(CosmicSeed, tracker->idToDet((*seedHits[ih]).geographicalId())->surface()); 00530 } else { 00531 propagated = propagator->propagate(updated, tracker->idToDet((*seedHits[ih]).geographicalId())->surface()); 00532 } 00533 if (!propagated.isValid()) { 00534 if (seedVerbosity_ > 1) 00535 std::cout << "Processing triplet " << it << ", hit " << ih << ": failed propagation." << std::endl; 00536 fail = true; break; 00537 } else { 00538 if (seedVerbosity_ > 2) 00539 std::cout << "Processing triplet " << it << ", hit " << ih << ": propagated state = " << propagated; 00540 } 00541 const TransientTrackingRecHit::ConstRecHitPointer & tthp = seedHits[ih]; 00542 TransientTrackingRecHit::RecHitPointer newtth = tthp->clone(propagated); 00543 hits.push_back(newtth->hit()->clone()); 00544 updated = theUpdator->update(propagated, *newtth); 00545 if (!updated.isValid()) { 00546 if (seedVerbosity_ > 1) 00547 std::cout << "Processing triplet " << it << ", hit " << ih << ": failed update." << std::endl; 00548 fail = true; break; 00549 } else { 00550 if (seedVerbosity_ > 2) 00551 std::cout << "Processing triplet " << it << ", hit " << ih << ": updated state = " << updated; 00552 } 00553 } 00554 if (!fail && updated.isValid() && (updated.globalMomentum().perp() < region_.ptMin())) { 00555 if (seedVerbosity_ > 1) 00556 std::cout << "Processing triplet " << it << 00557 ": failed for final pt " << updated.globalMomentum().perp() << " < " << region_.ptMin() << std::endl; 00558 fail = true; 00559 } 00560 if (!fail && updated.isValid() && (updated.globalMomentum().mag() < pMin_)) { 00561 if (seedVerbosity_ > 1) 00562 std::cout << "Processing triplet " << it << 00563 ": failed for final p " << updated.globalMomentum().perp() << " < " << pMin_ << std::endl; 00564 fail = true; 00565 } 00566 if (!fail) { 00567 if (rescaleError_ != 1.0) { 00568 if (seedVerbosity_ > 2) { 00569 std::cout << "Processing triplet " << it << ", rescale error by " << rescaleError_ << ": state BEFORE rescaling " << updated; 00570 std::cout << " Cartesian error (X,P) before rescaling= \n" << updated.cartesianError().matrix() << std::endl; 00571 } 00572 updated.rescaleError(rescaleError_); 00573 } 00574 if (seedVerbosity_ > 0) { 00575 std::cout << "Processed triplet " << it << ": success (saved as #"<<output.size()<<") : " 00576 << inner << " + " << middle << " + " << outer << std::endl; 00577 std::cout << " pt = " << updated.globalMomentum().perp() << 00578 " eta = " << updated.globalMomentum().eta() << 00579 " phi = " << updated.globalMomentum().phi() << 00580 " ch = " << updated.charge() << std::endl; 00581 if (seedVerbosity_ > 1) { 00582 std::cout << " State:" << updated; 00583 } else { 00584 std::cout << " X = " << updated.globalPosition() << ", P = " << updated.globalMomentum() << std::endl; 00585 } 00586 std::cout << " Cartesian error (X,P) = \n" << updated.cartesianError().matrix() << std::endl; 00587 } 00588 00589 std::auto_ptr<PTrajectoryStateOnDet> PTraj(transformer.persistentState(updated, 00590 (*(seedOnMiddle_ ? trip.middle() : trip.inner())).geographicalId().rawId())); 00591 output.push_back(TrajectorySeed(*PTraj,hits, 00592 ( (outer.y()-inner.y()>0) ? alongMomentum : oppositeToMomentum) )); 00593 if ((maxSeeds_ > 0) && (output.size() > size_t(maxSeeds_))) { 00594 output.clear(); 00595 edm::LogWarning("SimpleCosmicBONSeeder") << "Found too many seeds, bailing out.\n"; 00596 return false; 00597 } 00598 } 00599 } 00600 return true; 00601 }
bool SimpleCosmicBONSeeder::triplets | ( | const edm::Event & | e, | |
const edm::EventSetup & | c | |||
) |
ctfseeding SeedinHits and their iterators
Transient Tracking RecHits
Checks on the cluster charge and on noisy modules
Now actually filling in the charges for all the clusters
Definition at line 169 of file SimpleCosmicBONSeeder.cc.
References checkCharge(), checkCharge_, checkMaxHitsPerModule_, checkNoisyModules(), GenMuonPlsPt100GeV_cfg::cout, lat::endl(), Exception, goodHitsPerSeed_, goodTriplet(), helixVerbosity_, GlobalTrackingRegion::hits(), hitTriplets, SeedingLayerSetsBuilder::layers(), layerTripletNames_, ls, magfield, maxTriplets_, negativeYOnly, positiveYOnly, pqFromHelixFit(), TrackingRegionBase::ptMin(), region_, OrderedHitTriplets::size(), python::multivaluedict::sort(), theLsb, tripletsVerbosity_, and PV3DBase< T, PVType, FrameType >::y().
Referenced by produce().
00169 { 00170 using namespace ctfseeding; 00171 00172 hitTriplets.clear(); 00173 hitTriplets.reserve(0); 00174 SeedingLayerSets lss = theLsb.layers(es); 00175 SeedingLayerSets::const_iterator iLss; 00176 00177 double minRho = region_.ptMin() / ( 0.003 * magfield->inTesla(GlobalPoint(0,0,0)).z() ); 00178 00179 for (iLss = lss.begin(); iLss != lss.end(); iLss++){ 00180 SeedingLayers ls = *iLss; 00181 if (ls.size() != 3){ 00182 throw cms::Exception("CtfSpecialSeedGenerator") << "You are using " << ls.size() <<" layers in set instead of 3 "; 00183 } 00184 00186 std::vector<SeedingHit> innerHits = region_.hits(e, es, &ls[0]); 00187 std::vector<SeedingHit> middleHits = region_.hits(e, es, &ls[1]); 00188 std::vector<SeedingHit> outerHits = region_.hits(e, es, &ls[2]); 00189 std::vector<SeedingHit>::const_iterator iOuterHit,iMiddleHit,iInnerHit; 00190 00191 if (tripletsVerbosity_ > 0) { 00192 std::cout << "GenericTripletGenerator iLss = " << layerTripletNames_[iLss - lss.begin()] 00193 << " (" << (iLss - lss.begin()) << "): # = " 00194 << innerHits.size() << "/" << middleHits.size() << "/" << outerHits.size() << std::endl; 00195 } 00196 00198 typedef TransientTrackingRecHit::RecHitPointer TTRH; 00199 std::vector<TTRH> innerTTRHs, middleTTRHs, outerTTRHs; 00200 00202 std::vector<bool> innerOk( innerHits.size(), true); 00203 std::vector<bool> middleOk(middleHits.size(), true); 00204 std::vector<bool> outerOk( outerHits.size(), true); 00205 00206 size_t sizBefore = hitTriplets.size(); 00208 int idx = 0; 00209 for (iOuterHit = outerHits.begin(), idx = 0; iOuterHit != outerHits.end(); ++idx, ++iOuterHit){ 00210 outerTTRHs.push_back(ls[2].hitBuilder()->build(&(**iOuterHit))); 00211 if (checkCharge_ && !checkCharge(outerTTRHs.back()->hit())) outerOk[idx] = false; 00212 } 00213 for (iMiddleHit = middleHits.begin(), idx = 0; iMiddleHit != middleHits.end(); ++idx, ++iMiddleHit){ 00214 middleTTRHs.push_back(ls[1].hitBuilder()->build(&(**iMiddleHit))); 00215 if (checkCharge_ && !checkCharge(middleTTRHs.back()->hit())) middleOk[idx] = false; 00216 } 00217 for (iInnerHit = innerHits.begin(), idx = 0; iInnerHit != innerHits.end(); ++idx, ++iInnerHit){ 00218 innerTTRHs.push_back(ls[0].hitBuilder()->build(&(**iInnerHit))); 00219 if (checkCharge_ && !checkCharge(innerTTRHs.back()->hit())) innerOk[idx] = false; 00220 } 00221 if (checkMaxHitsPerModule_) { 00222 checkNoisyModules(innerTTRHs, innerOk); 00223 checkNoisyModules(middleTTRHs, middleOk); 00224 checkNoisyModules(outerTTRHs, outerOk); 00225 } 00226 00227 for (iOuterHit = outerHits.begin(); iOuterHit != outerHits.end(); iOuterHit++){ 00228 idx = iOuterHit - outerHits.begin(); 00229 TTRH & outerTTRH = outerTTRHs[idx]; 00230 GlobalPoint outerpos = outerTTRH->globalPosition(); // this caches by itself 00231 bool outerok = outerOk[idx]; 00232 if (outerok < goodHitsPerSeed_ - 2) { 00233 if (tripletsVerbosity_ > 2) 00234 std::cout << "Skipping at first hit: " << (outerok) << " < " << (goodHitsPerSeed_ - 2) << std::endl; 00235 continue; 00236 } 00237 00238 for (iMiddleHit = middleHits.begin(); iMiddleHit != middleHits.end(); iMiddleHit++){ 00239 idx = iMiddleHit - middleHits.begin(); 00240 TTRH & middleTTRH = middleTTRHs[idx]; 00241 GlobalPoint middlepos = middleTTRH->globalPosition(); // this caches by itself 00242 bool middleok = middleOk[idx]; 00243 if (outerok+middleok < goodHitsPerSeed_ - 1) { 00244 if (tripletsVerbosity_ > 2) 00245 std::cout << "Skipping at second hit: " << (outerok+middleok) << " < " << (goodHitsPerSeed_ - 1) << std::endl; 00246 continue; 00247 } 00248 00249 for (iInnerHit = innerHits.begin(); iInnerHit != innerHits.end(); iInnerHit++){ 00250 idx = iInnerHit - innerHits.begin(); 00251 TTRH & innerTTRH = innerTTRHs[idx]; 00252 GlobalPoint innerpos = innerTTRH->globalPosition(); // this caches by itself 00253 bool innerok = innerOk[idx]; 00254 if (outerok+middleok+innerok < goodHitsPerSeed_) { 00255 if (tripletsVerbosity_ > 2) 00256 std::cout << "Skipping at third hit: " << (outerok+middleok+innerok) << " < " << (goodHitsPerSeed_) << std::endl; 00257 continue; 00258 } 00259 00260 //***top-bottom 00261 if (positiveYOnly && (innerpos.y()<0 || middlepos.y()<0 || outerpos.y()<0 00262 || outerpos.y() < innerpos.y() 00263 ) ) continue; 00264 if (negativeYOnly && (innerpos.y()>0 || middlepos.y()>0 || outerpos.y()>0 00265 || outerpos.y() > innerpos.y() 00266 ) ) continue; 00267 //*** 00268 00269 if (tripletsVerbosity_ > 2) std::cout << "Trying seed with: " << innerpos << " + " << middlepos << " + " << outerpos << std::endl; 00270 if (goodTriplet(innerpos,middlepos,outerpos,minRho)) { 00271 OrderedHitTriplet oht(*iInnerHit,*iMiddleHit,*iOuterHit); 00272 hitTriplets.push_back(oht); 00273 if ((maxTriplets_ > 0) && (hitTriplets.size() > size_t(maxTriplets_))) { 00274 hitTriplets.clear(); // clear 00275 //OrderedHitTriplets().swap(hitTriplets); // really clear 00276 edm::LogWarning("SimpleCosmicBONSeeder") << "Found too many triplets, bailing out.\n"; 00277 return false; 00278 } 00279 if (tripletsVerbosity_ > 3) { 00280 std::cout << " accepted seed #" << (hitTriplets.size()-1) << " w/: " 00281 << innerpos << " + " << middlepos << " + " << outerpos << std::endl; 00282 } 00283 if (tripletsVerbosity_ == 2) { 00284 std::cout << " good seed #" << (hitTriplets.size()-1) << " w/: " 00285 << innerpos << " + " << middlepos << " + " << outerpos << std::endl; 00286 } 00287 if (tripletsVerbosity_ > 3 && (helixVerbosity_ > 0)) { // debug the momentum here too 00288 pqFromHelixFit(innerpos,middlepos,outerpos,es); 00289 } 00290 } 00291 } 00292 } 00293 } 00294 if ((tripletsVerbosity_ > 0) && (hitTriplets.size() > sizBefore)) { 00295 std::cout << " iLss = " << layerTripletNames_[iLss - lss.begin()] 00296 << " (" << (iLss - lss.begin()) << "): # = " 00297 << innerHits.size() << "/" << middleHits.size() << "/" << outerHits.size() 00298 << ": Found " << (hitTriplets.size() - sizBefore) << " seeds [running total: " << hitTriplets.size() << "]" 00299 << std::endl ; 00300 } 00301 00302 } 00303 std::sort(hitTriplets.begin(),hitTriplets.end(),HigherInnerHit()); 00304 return true; 00305 }
std::string SimpleCosmicBONSeeder::builderName [private] |
Definition at line 60 of file SimpleCosmicBONSeeder.h.
Referenced by init(), and SimpleCosmicBONSeeder().
std::vector<int32_t> SimpleCosmicBONSeeder::chargeThresholds_ [private] |
Definition at line 89 of file SimpleCosmicBONSeeder.h.
Referenced by checkCharge(), and SimpleCosmicBONSeeder().
ClusterChecker SimpleCosmicBONSeeder::check_ [private] |
bool SimpleCosmicBONSeeder::checkCharge_ [private] |
Definition at line 87 of file SimpleCosmicBONSeeder.h.
Referenced by SimpleCosmicBONSeeder(), and triplets().
Definition at line 90 of file SimpleCosmicBONSeeder.h.
Referenced by SimpleCosmicBONSeeder(), and triplets().
int SimpleCosmicBONSeeder::goodHitsPerSeed_ [private] |
Definition at line 86 of file SimpleCosmicBONSeeder.h.
Referenced by SimpleCosmicBONSeeder(), and triplets().
uint32_t SimpleCosmicBONSeeder::helixVerbosity_ [private] |
Definition at line 70 of file SimpleCosmicBONSeeder.h.
Referenced by pqFromHelixFit(), and triplets().
Definition at line 84 of file SimpleCosmicBONSeeder.h.
Referenced by produce(), seeds(), and triplets().
std::vector<std::string> SimpleCosmicBONSeeder::layerTripletNames_ [private] |
Definition at line 71 of file SimpleCosmicBONSeeder.h.
Referenced by SimpleCosmicBONSeeder(), and triplets().
Definition at line 73 of file SimpleCosmicBONSeeder.h.
Referenced by init(), pqFromHelixFit(), produce(), seeds(), and triplets().
Definition at line 88 of file SimpleCosmicBONSeeder.h.
Referenced by checkCharge(), and SimpleCosmicBONSeeder().
std::vector<int32_t> SimpleCosmicBONSeeder::maxHitsPerModule_ [private] |
Definition at line 91 of file SimpleCosmicBONSeeder.h.
Referenced by checkNoisyModules(), and SimpleCosmicBONSeeder().
int32_t SimpleCosmicBONSeeder::maxSeeds_ [private] |
int32_t SimpleCosmicBONSeeder::maxTriplets_ [private] |
bool SimpleCosmicBONSeeder::negativeYOnly [private] |
Definition at line 98 of file SimpleCosmicBONSeeder.h.
Referenced by SimpleCosmicBONSeeder(), and triplets().
double SimpleCosmicBONSeeder::pMin_ [private] |
Definition at line 64 of file SimpleCosmicBONSeeder.h.
Referenced by seeds(), and SimpleCosmicBONSeeder().
bool SimpleCosmicBONSeeder::positiveYOnly [private] |
Definition at line 97 of file SimpleCosmicBONSeeder.h.
Referenced by SimpleCosmicBONSeeder(), and triplets().
Definition at line 63 of file SimpleCosmicBONSeeder.h.
Referenced by seeds(), SimpleCosmicBONSeeder(), and triplets().
double SimpleCosmicBONSeeder::rescaleError_ [private] |
bool SimpleCosmicBONSeeder::seedOnMiddle_ [private] |
uint32_t SimpleCosmicBONSeeder::seedVerbosity_ [private] |
KFUpdator* SimpleCosmicBONSeeder::theUpdator [private] |
uint32_t SimpleCosmicBONSeeder::tripletsVerbosity_ [private] |
Definition at line 70 of file SimpleCosmicBONSeeder.h.
Referenced by checkCharge(), checkNoisyModules(), goodTriplet(), and triplets().
bool SimpleCosmicBONSeeder::writeTriplets_ [private] |
Definition at line 65 of file SimpleCosmicBONSeeder.h.
Referenced by produce(), and SimpleCosmicBONSeeder().