CMS 3D CMS Logo

SimpleCosmicBONSeeder Class Reference

#include <RecoTracker/SpecialSeedGenerators/interface/SimpleCosmicBONSeeder.h>

Inheritance diagram for SimpleCosmicBONSeeder:

edm::EDProducer edm::ProducerBase edm::ProductRegistryHelper

List of all members.

Public Member Functions

void done ()
bool goodTriplet (const GlobalPoint &inner, const GlobalPoint &middle, const GlobalPoint &outer, const double &minRho) const
void init (const edm::EventSetup &c)
std::pair< GlobalVector, intpqFromHelixFit (const GlobalPoint &inner, const GlobalPoint &middle, const GlobalPoint &outer, const edm::EventSetup &iSetup) const
virtual void produce (edm::Event &e, const edm::EventSetup &c)
bool seeds (TrajectorySeedCollection &output, const edm::EventSetup &iSetup)
 SimpleCosmicBONSeeder (const edm::ParameterSet &conf)
bool triplets (const edm::Event &e, const edm::EventSetup &c)
virtual ~SimpleCosmicBONSeeder ()

Private Member Functions

bool checkCharge (const SiStripRecHit2D &hit, int subdetid) const
bool checkCharge (const TrackingRecHit *hit) const
void checkNoisyModules (const std::vector< TransientTrackingRecHit::RecHitPointer > &hits, std::vector< bool > &oks) const

Private Attributes

std::string builderName
std::vector< int32_t > chargeThresholds_
ClusterChecker check_
bool checkCharge_
bool checkMaxHitsPerModule_
edm::ParameterSet conf_
int goodHitsPerSeed_
uint32_t helixVerbosity_
OrderedHitTriplets hitTriplets
std::vector< std::string > layerTripletNames_
edm::ESHandle< MagneticFieldmagfield
bool matchedRecHitUsesAnd_
std::vector< int32_t > maxHitsPerModule_
int32_t maxSeeds_
int32_t maxTriplets_
bool negativeYOnly
double pMin_
bool positiveYOnly
GlobalTrackingRegion region_
double rescaleError_
bool seedOnMiddle_
uint32_t seedVerbosity_
SeedingLayerSetsBuilder theLsb
PropagatorWithMaterialthePropagatorAl
PropagatorWithMaterialthePropagatorOp
KFUpdatortheUpdator
edm::ESHandle< TrackerGeometrytracker
TrajectoryStateTransform transformer
uint32_t tripletsVerbosity_
edm::ESHandle
< TransientTrackingRecHitBuilder
TTTRHBuilder
bool writeTriplets_


Detailed Description

Definition at line 38 of file SimpleCosmicBONSeeder.h.


Constructor & Destructor Documentation

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]

Definition at line 44 of file SimpleCosmicBONSeeder.h.

00044 {}


Member Function Documentation

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 }

void SimpleCosmicBONSeeder::done ( void   ) 

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 }


Member Data Documentation

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]

Definition at line 81 of file SimpleCosmicBONSeeder.h.

Referenced by produce().

bool SimpleCosmicBONSeeder::checkCharge_ [private]

Definition at line 87 of file SimpleCosmicBONSeeder.h.

Referenced by SimpleCosmicBONSeeder(), and triplets().

bool SimpleCosmicBONSeeder::checkMaxHitsPerModule_ [private]

Definition at line 90 of file SimpleCosmicBONSeeder.h.

Referenced by SimpleCosmicBONSeeder(), and triplets().

edm::ParameterSet SimpleCosmicBONSeeder::conf_ [private]

Definition at line 59 of file SimpleCosmicBONSeeder.h.

Referenced by SimpleCosmicBONSeeder().

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().

OrderedHitTriplets SimpleCosmicBONSeeder::hitTriplets [private]

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().

edm::ESHandle<MagneticField> SimpleCosmicBONSeeder::magfield [private]

Definition at line 73 of file SimpleCosmicBONSeeder.h.

Referenced by init(), pqFromHelixFit(), produce(), seeds(), and triplets().

bool SimpleCosmicBONSeeder::matchedRecHitUsesAnd_ [private]

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]

Definition at line 82 of file SimpleCosmicBONSeeder.h.

Referenced by seeds().

int32_t SimpleCosmicBONSeeder::maxTriplets_ [private]

Definition at line 82 of file SimpleCosmicBONSeeder.h.

Referenced by triplets().

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().

GlobalTrackingRegion SimpleCosmicBONSeeder::region_ [private]

Definition at line 63 of file SimpleCosmicBONSeeder.h.

Referenced by seeds(), SimpleCosmicBONSeeder(), and triplets().

double SimpleCosmicBONSeeder::rescaleError_ [private]

Definition at line 68 of file SimpleCosmicBONSeeder.h.

Referenced by seeds().

bool SimpleCosmicBONSeeder::seedOnMiddle_ [private]

Definition at line 67 of file SimpleCosmicBONSeeder.h.

Referenced by seeds().

uint32_t SimpleCosmicBONSeeder::seedVerbosity_ [private]

Definition at line 70 of file SimpleCosmicBONSeeder.h.

Referenced by seeds().

SeedingLayerSetsBuilder SimpleCosmicBONSeeder::theLsb [private]

Definition at line 62 of file SimpleCosmicBONSeeder.h.

Referenced by triplets().

PropagatorWithMaterial* SimpleCosmicBONSeeder::thePropagatorAl [private]

Definition at line 77 of file SimpleCosmicBONSeeder.h.

Referenced by done(), init(), and seeds().

PropagatorWithMaterial* SimpleCosmicBONSeeder::thePropagatorOp [private]

Definition at line 78 of file SimpleCosmicBONSeeder.h.

Referenced by done(), init(), and seeds().

KFUpdator* SimpleCosmicBONSeeder::theUpdator [private]

Definition at line 76 of file SimpleCosmicBONSeeder.h.

Referenced by done(), init(), and seeds().

edm::ESHandle<TrackerGeometry> SimpleCosmicBONSeeder::tracker [private]

Definition at line 74 of file SimpleCosmicBONSeeder.h.

Referenced by init(), and seeds().

TrajectoryStateTransform SimpleCosmicBONSeeder::transformer [private]

Definition at line 79 of file SimpleCosmicBONSeeder.h.

Referenced by seeds().

uint32_t SimpleCosmicBONSeeder::tripletsVerbosity_ [private]

Definition at line 70 of file SimpleCosmicBONSeeder.h.

Referenced by checkCharge(), checkNoisyModules(), goodTriplet(), and triplets().

edm::ESHandle<TransientTrackingRecHitBuilder> SimpleCosmicBONSeeder::TTTRHBuilder [private]

Definition at line 75 of file SimpleCosmicBONSeeder.h.

Referenced by init().

bool SimpleCosmicBONSeeder::writeTriplets_ [private]

Definition at line 65 of file SimpleCosmicBONSeeder.h.

Referenced by produce(), and SimpleCosmicBONSeeder().


The documentation for this class was generated from the following files:
Generated on Tue Jun 9 18:31:38 2009 for CMSSW by  doxygen 1.5.4