CMS 3D CMS Logo

ConvBremSeedProducer Class Reference

#include <RecoParticleFlow/PFTracking/interface/ConvBremSeedProducer.h>

Inheritance diagram for ConvBremSeedProducer:

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

List of all members.

Public Member Functions

 ConvBremSeedProducer (const edm::ParameterSet &)
 ~ConvBremSeedProducer ()

Private Types

typedef
GeometricSearchDet::DetWithState 
DetWithState
typedef
SiStripMatchedRecHit2DCollection::const_iterator 
MatIter
typedef
SiStripMatchedRecHit2DCollection::range 
MatRange
typedef
SiPixelRecHitCollection::const_iterator 
PiIter
typedef
SiPixelRecHitCollection::range 
PiRange
typedef
SiStripRecHit2DCollection::const_iterator 
StIter
typedef
SiStripRecHit2DCollection::range 
StRange

Private Member Functions

virtual void beginJob (const edm::EventSetup &)
const DetLayerdetLayer (const TrackerLayer &layer, float zpos) const
virtual void endJob ()
int GoodCluster (BaseParticlePropagator bpg, const reco::PFClusterCollection &pfc, float minep, bool sec=false)
void initializeLayerMap ()
bool isGsfTrack (TrackingRecHitRefVector, const TrackingRecHit *)
TrajectoryStateOnSurface makeTrajectoryState (const DetLayer *layer, const ParticlePropagator &pp, const MagneticField *field) const
virtual void produce (edm::Event &, const edm::EventSetup &)
std::vector< boolsharedHits (std::vector< std::pair< TrajectorySeed, std::pair< GlobalVector, float > > >)

Private Attributes

math::XYZVector B_
 B field.
edm::ParameterSet conf_
const MagneticFieldMapfieldMap_
const TrackerInteractionGeometrygeometry_
const GeometricSearchTrackergeomSearchTracker_
const
TransientTrackingRecHitBuilder
hitBuilder_
const KFUpdatorkfUpdator_
std::vector< const DetLayer * > layerMap_
const MagneticFieldmagfield_
int negLayerOffset_
const PropagatorWithMaterialpropagator_
std::vector< const DetLayer * > theLayerMap
const TrackerGeometrytracker_
const TrajectoryStateTransformtransformer_


Detailed Description

Definition at line 41 of file ConvBremSeedProducer.h.


Member Typedef Documentation

typedef GeometricSearchDet::DetWithState ConvBremSeedProducer::DetWithState [private]

Definition at line 48 of file ConvBremSeedProducer.h.

typedef SiStripMatchedRecHit2DCollection::const_iterator ConvBremSeedProducer::MatIter [private]

Definition at line 47 of file ConvBremSeedProducer.h.

typedef SiStripMatchedRecHit2DCollection::range ConvBremSeedProducer::MatRange [private]

Definition at line 46 of file ConvBremSeedProducer.h.

typedef SiPixelRecHitCollection::const_iterator ConvBremSeedProducer::PiIter [private]

Definition at line 45 of file ConvBremSeedProducer.h.

typedef SiPixelRecHitCollection::range ConvBremSeedProducer::PiRange [private]

Definition at line 43 of file ConvBremSeedProducer.h.

typedef SiStripRecHit2DCollection::const_iterator ConvBremSeedProducer::StIter [private]

Definition at line 44 of file ConvBremSeedProducer.h.

typedef SiStripRecHit2DCollection::range ConvBremSeedProducer::StRange [private]

Definition at line 42 of file ConvBremSeedProducer.h.


Constructor & Destructor Documentation

ConvBremSeedProducer::ConvBremSeedProducer ( const edm::ParameterSet iConfig  )  [explicit]

Definition at line 51 of file ConvBremSeedProducer.cc.

00051                                                                      :
00052   conf_(iConfig),
00053   fieldMap_(0),
00054   layerMap_(56, static_cast<const DetLayer*>(0)),
00055   negLayerOffset_(27)
00056 {
00057   produces<ConvBremSeedCollection>();
00058 }

ConvBremSeedProducer::~ConvBremSeedProducer (  ) 

Definition at line 61 of file ConvBremSeedProducer.cc.

00062 {
00063  
00064 
00065 }


Member Function Documentation

void ConvBremSeedProducer::beginJob ( const edm::EventSetup iSetup  )  [private, virtual]

Reimplemented from edm::EDProducer.

Definition at line 386 of file ConvBremSeedProducer.cc.

References alongMomentum, B_, conf_, fieldMap_, geometry_, geomSearchTracker_, edm::EventSetup::get(), edm::ParameterSet::getParameter(), hitBuilder_, MagneticField::inTesla(), kfUpdator_, volumeBasedMagneticField_1103l_cfi::magfield, magfield_, edm::ESHandle< T >::product(), propagator_, track, tracker_, and transformer_.

00387 {
00388   ESHandle<GeometricSearchTracker> track;
00389   iSetup.get<TrackerRecoGeometryRecord>().get( track ); 
00390   geomSearchTracker_ = track.product();
00391   
00392   ESHandle<TrackerInteractionGeometry>  theTrackerInteractionGeometry;
00393   iSetup.get<TrackerInteractionGeometryRecord>().get(theTrackerInteractionGeometry );
00394   geometry_=theTrackerInteractionGeometry.product();
00395 
00396   ESHandle<TrackerGeometry> tracker;
00397   iSetup.get<TrackerDigiGeometryRecord>().get(tracker);
00398   tracker_=tracker.product();
00399 
00400   ESHandle<MagneticField> magfield;
00401   iSetup.get<IdealMagneticFieldRecord>().get(magfield);
00402   magfield_=magfield.product();
00403   B_=magfield_->inTesla(GlobalPoint(0,0,0));
00404 
00405   ESHandle<MagneticFieldMap> fieldMap;
00406   iSetup.get<MagneticFieldMapRecord>().get(fieldMap);
00407   fieldMap_ =fieldMap.product();
00408 
00409 
00410 
00411   ESHandle<TransientTrackingRecHitBuilder> hitBuilder;
00412   iSetup.get<TransientRecHitRecord>().get(conf_.getParameter<string>("TTRHBuilder"),hitBuilder);
00413   hitBuilder_= hitBuilder.product();
00414 
00415   propagator_  =    new PropagatorWithMaterial(alongMomentum,0.0005,&(*magfield) );
00416   kfUpdator_   =    new KFUpdator();
00417   transformer_ =    new TrajectoryStateTransform();
00418 }

const DetLayer * ConvBremSeedProducer::detLayer ( const TrackerLayer layer,
float  zpos 
) const [private]

Definition at line 527 of file ConvBremSeedProducer.cc.

References TrackerLayer::forward(), layerMap_, TrackerLayer::layerNumber(), and negLayerOffset_.

Referenced by produce().

00528 {
00529   if (zpos > 0 || !layer.forward() ) return layerMap_[layer.layerNumber()];
00530   else return layerMap_[layer.layerNumber()+negLayerOffset_];
00531 }

void ConvBremSeedProducer::endJob ( void   )  [private, virtual]

Reimplemented from edm::EDProducer.

Definition at line 421 of file ConvBremSeedProducer.cc.

References kfUpdator_, propagator_, and transformer_.

00421                              {
00422   delete propagator_;
00423   delete kfUpdator_;
00424   delete transformer_;
00425 }

int ConvBremSeedProducer::GoodCluster ( BaseParticlePropagator  bpg,
const reco::PFClusterCollection pfc,
float  minep,
bool  sec = false 
) [private]

Definition at line 610 of file ConvBremSeedProducer.cc.

References eta, BaseParticlePropagator::getSuccess(), i, RawParticle::momentum(), phi, funct::pow(), BaseParticlePropagator::propagateToEcalEntrance(), funct::sqrt(), TwoPi, and RawParticle::vertex().

Referenced by produce().

00610                                                                                                                       {
00611 
00612   bpg.propagateToEcalEntrance(false);
00613   float dr=1000;
00614   float de=1000;
00615   float df=1000;
00616   int ibest=-1;
00617 
00618   if(bpg.getSuccess()!=0){
00619 
00620     for (uint i =0; i<pfc.size();i++ ){
00621       float tmp_ep=pfc[i].energy()/bpg.momentum().e();
00622       float tmp_phi=fabs(pfc[i].position().phi()-bpg.vertex().phi());
00623       if (tmp_phi>TMath::TwoPi()) tmp_phi-= TMath::TwoPi(); 
00624       float tmp_eta=fabs(pfc[i].position().eta()-bpg.vertex().eta());
00625       float tmp_dr=sqrt(pow(tmp_phi,2)+pow(tmp_eta,2));
00626       bool isBet=(tmp_dr<dr);
00627       if (sec) isBet=(tmp_phi<df);
00628       if ((isBet)&&(tmp_ep>minep)&&(tmp_ep<10)){
00629         dr=tmp_dr;
00630         de=tmp_eta;
00631         df=tmp_phi; 
00632         ibest=i;
00633       }
00634     }
00635     bool isBad=(dr>0.1);
00636     if (sec) isBad= ((df>0.25) || (de>0.5));
00637 
00638     if (isBad) ibest=-1;
00639 
00640   }
00641   return ibest;
00642 }

void ConvBremSeedProducer::initializeLayerMap (  )  [private]

ATTENTION: HARD CODED LOGIC! If Famos layer numbering changes this logic needs to be adapted to the new numbering!

Definition at line 428 of file ConvBremSeedProducer.cc.

References GeometricSearchTracker::barrelLayers(), TrackerInteractionGeometry::cylinderBegin(), TrackerInteractionGeometry::cylinderEnd(), muonGeometry::disk, geometry_, geomSearchTracker_, i, BoundDisk::innerRadius(), layerMap_, LogDebug, BoundDisk::outerRadius(), GeometricSearchTracker::posForwardLayers(), GloballyPositioned< T >::position(), and Cylinder::radius().

Referenced by produce().

00429 {
00430 
00431 
00432   // These are the BoundSurface&, the BoundDisk* and the BoundCylinder* for that layer
00433   //   const BoundSurface& theSurface = layer.surface();
00434   //   BoundDisk* theDisk = layer.disk();  // non zero for endcaps
00435   //   BoundCylinder* theCylinder = layer.cylinder(); // non zero for barrel
00436   //   int theLayer = layer.layerNumber(); // 1->3 PixB, 4->5 PixD, 
00437   //                                       // 6->9 TIB, 10->12 TID, 
00438   //                                       // 13->18 TOB, 19->27 TEC
00439   
00442     
00443     std::vector< BarrelDetLayer*>   barrelLayers = 
00444       geomSearchTracker_->barrelLayers();
00445     LogDebug("FastTracker") << "Barrel DetLayer dump: ";
00446     for (std::vector< BarrelDetLayer*>::const_iterator bl=barrelLayers.begin();
00447          bl != barrelLayers.end(); ++bl) {
00448       LogDebug("FastTracker")<< "radius " << (**bl).specificSurface().radius(); 
00449     }
00450 
00451   std::vector< ForwardDetLayer*>  posForwardLayers = 
00452     geomSearchTracker_->posForwardLayers();
00453   LogDebug("FastTracker") << "Positive Forward DetLayer dump: ";
00454   for (std::vector< ForwardDetLayer*>::const_iterator fl=posForwardLayers.begin();
00455        fl != posForwardLayers.end(); ++fl) {
00456     LogDebug("FastTracker") << "Z pos "
00457                             << (**fl).surface().position().z()
00458                             << " radii " 
00459                             << (**fl).specificSurface().innerRadius() 
00460                             << ", " 
00461                             << (**fl).specificSurface().outerRadius(); 
00462   }
00463 
00464   const float rTolerance = 1.5;
00465   const float zTolerance = 3.;
00466 
00467   LogDebug("FastTracker")<< "Dump of TrackerInteractionGeometry cylinders:";
00468   for( std::list<TrackerLayer>::const_iterator i=geometry_->cylinderBegin();
00469        i!=geometry_->cylinderEnd(); ++i) {
00470     const BoundCylinder* cyl = i->cylinder();
00471     const BoundDisk* disk = i->disk();
00472 
00473     LogDebug("FastTracker") << "Famos Layer no " << i->layerNumber()
00474                             << " is sensitive? " << i->sensitive()
00475                             << " pos " << i->surface().position();
00476     if (!i->sensitive()) continue;
00477 
00478     if (cyl != 0) {
00479 
00480       LogDebug("FastTracker") << " cylinder radius " << cyl->radius();
00481       bool found = false;
00482 
00483       for (std::vector< BarrelDetLayer*>::const_iterator 
00484              bl=barrelLayers.begin(); bl != barrelLayers.end(); ++bl) {
00485 
00486         if (fabs( cyl->radius() - (**bl).specificSurface().radius()) < rTolerance) {
00487 
00488           layerMap_[i->layerNumber()] = *bl;
00489           found = true;
00490           LogDebug("FastTracker")<< "Corresponding DetLayer found with radius "
00491                                  << (**bl).specificSurface().radius();
00492                   
00493           break;
00494         }
00495       }
00496       if (!found) {
00497         LogError("FastTracker") << "FAILED to find a corresponding DetLayer!";
00498       }
00499     }
00500     else {
00501       LogDebug("FastTracker") << " disk radii " << disk->innerRadius() 
00502                  << ", " << disk->outerRadius();
00503 
00504       bool found = false;
00505 
00506       for (std::vector< ForwardDetLayer*>::const_iterator fl=posForwardLayers.begin();
00507            fl != posForwardLayers.end(); ++fl) {
00508         if (fabs( disk->position().z() - (**fl).surface().position().z()) < zTolerance) {
00509           layerMap_[i->layerNumber()] = *fl;
00510           found = true;
00511           LogDebug("FastTracker") << "Corresponding DetLayer found with Z pos "
00512                                   << (**fl).surface().position().z()
00513                                   << " and radii " 
00514                                   << (**fl).specificSurface().innerRadius() 
00515                                   << ", " 
00516                                   << (**fl).specificSurface().outerRadius(); 
00517           break;
00518         }
00519       }
00520       if (!found) {
00521         LogError("FastTracker") << "FAILED to find a corresponding DetLayer!";
00522       }
00523     }
00524   }
00525 
00526 }

bool ConvBremSeedProducer::isGsfTrack ( TrackingRecHitRefVector  tkv,
const TrackingRecHit h 
) [private]

Definition at line 547 of file ConvBremSeedProducer.cc.

References TrackingRecHit::all, edm::RefVector< C, T, F >::begin(), and edm::RefVector< C, T, F >::end().

Referenced by produce().

00547                                                                                           {
00548   trackingRecHit_iterator ib=tkv.begin();
00549   trackingRecHit_iterator ie=tkv.end();
00550   bool istaken=false;
00551   //  for (;ib!=ie-2;++ib){
00552     for (;ib!=ie;++ib){
00553     if (istaken) continue;
00554     if (!((*ib)->isValid())) continue;
00555  
00556     istaken = (*ib)->sharesInput(h,TrackingRecHit::all);
00557   }
00558   return istaken;
00559 }

TrajectoryStateOnSurface ConvBremSeedProducer::makeTrajectoryState ( const DetLayer layer,
const ParticlePropagator pp,
const MagneticField field 
) const [private]

Definition at line 534 of file ConvBremSeedProducer.cc.

References RawParticle::charge(), GeometricSearchDet::surface(), Surface::tangentPlane(), RawParticle::X(), RawParticle::Y(), and RawParticle::Z().

Referenced by produce().

00537 {
00538 
00539   GlobalPoint  pos( pp.X(), pp.Y(), pp.Z());
00540   GlobalVector mom( pp.Px(), pp.Py(), pp.Pz());
00541 
00542   ReferenceCountingPointer<TangentPlane> plane = layer->surface().tangentPlane(pos);
00543 
00544   return TrajectoryStateOnSurface
00545     (GlobalTrajectoryParameters( pos, mom, TrackCharge( pp.charge()), field), *plane);
00546 }

void ConvBremSeedProducer::produce ( edm::Event iEvent,
const edm::EventSetup iSetup 
) [private, virtual]

INPUT COLLECTIONS

PF CLUSTERS

PIXEL

STRIP

OUTPUT COLLECTION

INITIALIZE

LOOP OVER GSF TRACK COLLECTION

FIND THE CLUSTER ASSOCIATED TO THE GSF TRACK

LOOP OVER BREM PHOTONS

BREM SELECTION

LOOP OVER TRACKER LAYER

TRACKER LAYER SELECTION

FIND COMPATIBLE MODULES

MODULE TRIPLETS SELECTION

SEED CREATION

Implements edm::EDProducer.

Definition at line 69 of file ConvBremSeedProducer.cc.

References alongMomentum, anyDirection, B_, TransientTrackingRecHitBuilder::build(), GlobalTrajectoryParameters::charge(), edm::OwnVector< T, P >::clear(), clone(), GeometricSearchDet::compatibleDets(), conf_, TrackerInteractionGeometry::cylinderBegin(), TrackerInteractionGeometry::cylinderEnd(), detLayer(), edm::EventID::event(), fieldMap_, first, geometry_, edm::Event::getByLabel(), BaseParticlePropagator::getMagneticField(), edm::ParameterSet::getParameter(), BaseParticlePropagator::getSuccess(), GoodCluster(), gp1, hitBuilder_, i, i1, i2, i3, edm::Event::id(), TrackerGeometry::idToDet(), initializeLayerMap(), isGsfTrack(), TrajectoryStateOnSurface::isValid(), it1, it3, kfUpdator_, LogDebug, magfield_, makeTrajectoryState(), GlobalTrajectoryParameters::momentum(), output(), p, FreeTrajectoryState::parameters(), PV3DBase< T, PVType, FrameType >::perp(), TrajectoryStateTransform::persistentState(), GeomDetEnumerators::PixelBarrel, GeomDetEnumerators::PixelEndcap, GlobalTrajectoryParameters::position(), edm::Handle< T >::product(), PropagatorWithMaterial::propagate(), BaseParticlePropagator::propagate(), propagator_, edm::OwnVector< T, P >::push_back(), edm::Event::put(), python::SiStripOnlineP5_cfg::rphirecHits, edm::EventID::run(), RawParticle::setCharge(), ParticlePropagator::setPropagationConditions(), sharedHits(), edm::AssociationMap< Tag >::size(), funct::sqrt(), state, FastHelix::stateAtVertex(), python::SiStripOnlineP5_cfg::stereorecHits, DetLayer::subDetector(), GeomDet::surface(), pyDBSRunClass::temp, tmp, tracker_, transformer_, KFUpdator::update(), PV3DBase< T, PVType, FrameType >::x(), PV3DBase< T, PVType, FrameType >::y(), PV3DBase< T, PVType, FrameType >::z(), and RawParticle::Z().

00070 {
00071  
00072   LogDebug("ConvBremSeedProducerProducer")<<"START event: "<<iEvent.id().event()
00073                                           <<" in run "<<iEvent.id().run();
00074 
00075   float pfmass=  0.0005;
00076 
00078 
00080   Handle<PFClusterCollection> PfC;
00081   iEvent.getByLabel(conf_.getParameter<InputTag>("PFClusters") ,PfC);
00082   const PFClusterCollection& PPP= *(PfC.product());
00083  
00085   Handle<SiPixelRecHitCollection> pixelHits;
00086   iEvent.getByLabel(conf_.getParameter<InputTag>("pixelRecHits") , pixelHits);
00087 
00089   Handle<SiStripRecHit2DCollection> rphirecHits;
00090   iEvent.getByLabel(conf_.getParameter<InputTag>("rphirecHits"),rphirecHits);
00091   Handle<SiStripRecHit2DCollection> stereorecHits;
00092   iEvent.getByLabel(conf_.getParameter<InputTag>("stereorecHits"), stereorecHits);
00093   Handle<SiStripMatchedRecHit2DCollection> matchedrecHits;
00094   iEvent.getByLabel(conf_.getParameter<InputTag>("matchedrecHits"), matchedrecHits);
00095 
00096   //GSFPFRECTRACKS
00097   Handle<GsfPFRecTrackCollection> thePfRecTrackCollection;
00098   iEvent.getByLabel(conf_.getParameter<InputTag>("PFRecTrackLabel"),
00099                     thePfRecTrackCollection);
00100   const GsfPFRecTrackCollection PfRTkColl = *(thePfRecTrackCollection.product()); 
00101 
00102 
00104   std::auto_ptr<ConvBremSeedCollection> output(new ConvBremSeedCollection);
00105 
00106 
00108   vector<pair< TrajectorySeed , pair<GlobalVector,float> > > unclean;
00109   //TRIPLET OF MODULES TO BE USED FOR SEEDING
00110   vector< vector< long int > > tripl;
00111   //LAYER MAP
00112   initializeLayerMap(); 
00113 
00114 
00115 
00117 
00118   for(uint ipft=0;ipft<PfRTkColl.size();ipft++){
00119     GsfPFRecTrackRef pft(thePfRecTrackCollection,ipft);
00120     LogDebug("ConvBremSeedProducerProducer")<<"NEW GsfPFRecTRACK ";
00121     float eta_br=0;
00122     unclean.clear();
00123     tripl.clear();
00124     vector<int> gc;
00125     TrackingRecHitRefVector gsfRecHits=pft->gsfTrackRef()->extra()->recHits();
00126     float pfoutenergy=sqrt((pfmass*pfmass)+pft->gsfTrackRef()->outerMomentum().Mag2());
00127     XYZTLorentzVector mom =XYZTLorentzVector(pft->gsfTrackRef()->outerMomentum().x(),
00128                                              pft->gsfTrackRef()->outerMomentum().y(),
00129                                              pft->gsfTrackRef()->outerMomentum().z(),
00130                                              pfoutenergy);
00131     XYZTLorentzVector pos =   XYZTLorentzVector(pft->gsfTrackRef()->outerPosition().x(),
00132                                                 pft->gsfTrackRef()->outerPosition().y(),
00133                                                 pft->gsfTrackRef()->outerPosition().z(),
00134                                                 0.);
00135     BaseParticlePropagator theOutParticle=BaseParticlePropagator( RawParticle(mom,pos),
00136                                                                   0,0,B_.z());
00137     theOutParticle.setCharge(pft->gsfTrackRef()->charge());
00138 
00140     gc.push_back(GoodCluster(theOutParticle,PPP,0.5));
00141 
00142 
00143     vector<PFBrem> brem =(*pft).PFRecBrem();
00144     vector<PFBrem>::iterator ib=brem.begin();
00145     vector<PFBrem>::iterator ib_end=brem.end();
00146     LogDebug("ConvBremSeedProducerProducer")<<"NUMBER OF BREMS "<<brem.size();
00147 
00149     for (;ib!=ib_end;++ib){
00150     
00151       XYZTLorentzVector mom=pft->trajectoryPoint(ib->indTrajPoint()).momentum();
00152       XYZTLorentzVector pos=
00153         XYZTLorentzVector(
00154                           pft->trajectoryPoint(ib->indTrajPoint()).position().x(),
00155                           pft->trajectoryPoint(ib->indTrajPoint()).position().y(),
00156                           pft->trajectoryPoint(ib->indTrajPoint()).position().z(),
00157                           0);
00158       
00160       if (pos.Rho()>80) continue;
00161       if ((pos.Rho()>5)&&(fabs(ib->SigmaDeltaP()/ib->DeltaP())>3)) continue;  
00162       if (fabs(ib->DeltaP())<3) continue;
00163       eta_br=mom.eta();
00164       vector< vector< long int > >Idd;
00165       
00166 
00167 
00168       BaseParticlePropagator p( RawParticle(mom,pos),
00169                                 0,0,B_.z());
00170       p.setCharge(0);
00171       gc.push_back(GoodCluster(p,PPP,0.2));
00172 
00173       ParticlePropagator PP(p,fieldMap_);
00174 
00176       list<TrackerLayer>::const_iterator cyliter= geometry_->cylinderBegin();
00177       for ( ; cyliter != geometry_->cylinderEnd() ; ++cyliter ) {
00178 
00180        if (!(cyliter->sensitive())) continue;
00181        PP.setPropagationConditions(*cyliter);
00182        PP.propagate();    
00183        if (PP.getSuccess()==0) continue;
00184 
00186        LocalMagneticField mf(PP.getMagneticField());
00187        AnalyticalPropagator alongProp(&mf, anyDirection);
00188        InsideBoundsMeasurementEstimator est;
00189        const DetLayer* tkLayer = detLayer(*cyliter,PP.Z());
00190        if (&(*tkLayer)==0) continue;
00191        TrajectoryStateOnSurface trajState = makeTrajectoryState( tkLayer, PP, &mf);
00192             
00193        std::vector<DetWithState> compat 
00194          = tkLayer->compatibleDets( trajState, alongProp, est);
00195        vector <long int> temp;
00196        if (compat.size()==0) continue;
00197 
00198        for (std::vector<DetWithState>::const_iterator i=compat.begin(); i!=compat.end(); i++) {
00199               
00200          long int detid=i->first->geographicalId().rawId();
00201          
00202          if ((tkLayer->subDetector()!=GeomDetEnumerators::PixelBarrel)&&
00203              (tkLayer->subDetector()!=GeomDetEnumerators::PixelEndcap)){
00204            
00205            
00206            StRange Range = (rphirecHits.product())->              
00207              get((detid));
00208            MatRange MRange =(matchedrecHits.product())->                  
00209              get((detid));
00210            
00211                 
00212            long int DetID=(Range.second!=Range.first)? detid:0;
00213 
00214            if (MRange.second!=MRange.first) {
00215              long int pii=(*MRange.first).monoHit()->geographicalId().rawId();
00216              StRange CRange = (rphirecHits.product())->           
00217                get((pii));
00218              
00219              DetID=(CRange.second!=CRange.first)? pii:0;
00220              
00221            }
00222 
00223            temp.push_back(DetID);
00224            
00225          }
00226          else{
00227            SiPixelRecHitCollection::range Range = (pixelHits.product())->
00228              get((detid));
00229            long int DetID=(Range.second!=Range.first)? detid:0;
00230            temp.push_back(DetID);
00231         
00232         
00233          }
00234        }
00235 
00236        Idd.push_back(temp);
00237 
00238       }//END TRACKER LAYER LOOP
00239       if(Idd.size()<2)continue;
00240 
00242       for (uint i=0;i<Idd.size()-2;i++){
00243         for (uint i1=0;i1<Idd[i].size();i1++){
00244           for (uint i2=0;i2<Idd[i+1].size();i2++){
00245             for (uint i3=0;i3<Idd[i+2].size();i3++){
00246               if ((Idd[i][i1]!=0) &&(Idd[i+1][i2]!=0) &&(Idd[i+2][i3]!=0) ){
00247                 vector<long int >tmp;
00248                 tmp.push_back(Idd[i][i1]);  tmp.push_back(Idd[i+1][i2]); tmp.push_back(Idd[i+2][i3]);
00249                 
00250                 bool newTrip=true;
00251                 for (uint iv=0;iv<tripl.size();iv++){
00252                   if((tripl[iv][0]==tmp[0])&&(tripl[iv][1]==tmp[1])&&(tripl[iv][2]==tmp[2])) newTrip=false;
00253 
00254                 }
00255                 if (newTrip){
00256 
00257                   tripl.push_back(tmp);
00258                 }
00259               }
00260             }     
00261           }       
00262         }
00263       }
00264     }//END BREM LOOP
00265 
00266     float sineta_brem =sinh(eta_br);
00267     
00268 
00269     //OUTPUT COLLECTION
00270 
00271     TransientTrackingRecHit::ConstRecHitContainer glob_hits;
00272     OwnVector<TrackingRecHit> loc_hits;
00273     for (uint i=0;i<tripl.size();i++){
00274       StRange Range1 = (rphirecHits.product())->get(tripl[i][0]);
00275       StRange Range2 = (rphirecHits.product())->get(tripl[i][1]);
00276       StRange Range3 = (rphirecHits.product())->get(tripl[i][2]);
00277 
00278       for (StIter it1=Range1.first;it1!=Range1.second;++it1){
00279         GlobalPoint gp1=tracker_->idToDet(tripl[i][0])->surface().
00280           toGlobal(it1->localPosition());
00281 
00282         bool tak1=isGsfTrack(gsfRecHits,&(*it1));
00283         
00284         for (StIter it2=Range2.first;it2!=Range2.second;++it2){
00285           GlobalPoint gp2=tracker_->idToDet(tripl[i][1])->surface().
00286             toGlobal(it2->localPosition());
00287           bool tak2=isGsfTrack(gsfRecHits,&(*it2));
00288 
00289           for (StIter it3=Range3.first;it3!=Range3.second;++it3){
00290             //  ips++;
00291             GlobalPoint gp3=tracker_->idToDet(tripl[i][2])->surface().
00292               toGlobal(it3->localPosition());    
00293             bool tak3=isGsfTrack(gsfRecHits,&(*it3));  
00294             
00295 
00296             FastHelix helix(gp3, gp2, gp1,iSetup);
00297             GlobalVector gv=helix.stateAtVertex().parameters().momentum();
00298             GlobalVector gv_corr(gv.x(),gv.y(),gv.perp()*sineta_brem);
00299             float ene= sqrt(gv_corr.mag2()+(pfmass*pfmass));
00300 
00301             GlobalPoint gp=helix.stateAtVertex().parameters().position();
00302             float ch=helix.stateAtVertex().parameters().charge();
00303 
00304 
00305 
00306 
00307             XYZTLorentzVector mom = XYZTLorentzVector(gv.x(),gv.y(),gv_corr.z(),ene);
00308             XYZTLorentzVector pos = XYZTLorentzVector(gp.x(),gp.y(),gp.z(),0.);
00309             BaseParticlePropagator theOutParticle(RawParticle(mom,pos),0,0,B_.z());
00310             theOutParticle.setCharge(ch);
00311             int bgc=GoodCluster(theOutParticle,PPP,0.3,true);
00312 
00313             if (gv.perp()<0.5) continue;
00314 
00315             if (tak1+tak2+tak3>2) continue;
00316 
00317             if (bgc==-1) continue;
00318             bool clTak=false;
00319             for (uint igcc=0; igcc<gc.size(); igcc++){
00320               if (clTak) continue;
00321               if (bgc==gc[igcc]) clTak=true;
00322             }
00323             if (clTak) continue;
00324 
00325 
00326 
00327 
00328             GlobalTrajectoryParameters Gtp(gp1,
00329                                            gv,int(ch), 
00330                                            &(*magfield_));
00331             glob_hits.clear(); loc_hits.clear();
00332             glob_hits.push_back(hitBuilder_->build(it1->clone()));
00333             glob_hits.push_back(hitBuilder_->build(it2->clone()));
00334             glob_hits.push_back(hitBuilder_->build(it3->clone()));
00335 
00337 
00338             FreeTrajectoryState CSeed(Gtp,
00339                                       CurvilinearTrajectoryError(AlgebraicSymMatrix55(AlgebraicMatrixID())));
00340             TrajectoryStateOnSurface updatedState;        
00341   
00342             for (int ih=0;ih<3;ih++){
00343 
00344               TrajectoryStateOnSurface state = (ih==0)?
00345                 propagator_->propagate(CSeed,
00346                                        tracker_->idToDet(tripl[i][ih])->surface()):
00347                 propagator_->propagate(updatedState,
00348                                        tracker_->idToDet(tripl[i][ih])->surface());
00349               
00350               if (!state.isValid()){ 
00351                 ih=3;
00352                 continue;}
00353 
00354               updatedState =  kfUpdator_->update(state, *glob_hits[ih]);
00355               loc_hits.push_back(glob_hits[ih]->hit()->clone());
00356               if (ih==2){
00357                 PTrajectoryStateOnDet *PTraj= 
00358                   transformer_->persistentState(updatedState,tripl[i][2]);
00359                 //              output->push_back(Trajectoryseed(*PTraj,loc_hits,alongMomentum));
00360                 unclean.push_back(make_pair(TrajectorySeed(*PTraj,loc_hits,alongMomentum), 
00361                                             make_pair(gv_corr,ch)));
00362               }
00363               //    }
00364 
00365             }
00366           }    
00367         }    
00368       }
00369     }
00370     vector<bool> inPhot = sharedHits(unclean);
00371     for (uint iu=0; iu<unclean.size();iu++){
00372 
00373       if (inPhot[iu])
00374         output->push_back(ConvBremSeed(unclean[iu].first,pft));
00375 
00376     }
00377 
00378   } //END GSF TRACK COLLECTION LOOP 
00379   LogDebug("ConvBremSeedProducerProducer")<<"END";
00380   iEvent.put(output);
00381     
00382 }

std::vector<bool> ConvBremSeedProducer::sharedHits ( std::vector< std::pair< TrajectorySeed, std::pair< GlobalVector, float > > >   )  [private]

Referenced by produce().


Member Data Documentation

math::XYZVector ConvBremSeedProducer::B_ [private]

B field.

Definition at line 86 of file ConvBremSeedProducer.h.

Referenced by beginJob(), and produce().

edm::ParameterSet ConvBremSeedProducer::conf_ [private]

Definition at line 73 of file ConvBremSeedProducer.h.

Referenced by beginJob(), and produce().

const MagneticFieldMap* ConvBremSeedProducer::fieldMap_ [private]

Definition at line 78 of file ConvBremSeedProducer.h.

Referenced by beginJob(), and produce().

const TrackerInteractionGeometry* ConvBremSeedProducer::geometry_ [private]

Definition at line 75 of file ConvBremSeedProducer.h.

Referenced by beginJob(), initializeLayerMap(), and produce().

const GeometricSearchTracker* ConvBremSeedProducer::geomSearchTracker_ [private]

Definition at line 74 of file ConvBremSeedProducer.h.

Referenced by beginJob(), and initializeLayerMap().

const TransientTrackingRecHitBuilder* ConvBremSeedProducer::hitBuilder_ [private]

Definition at line 81 of file ConvBremSeedProducer.h.

Referenced by beginJob(), and produce().

const KFUpdator* ConvBremSeedProducer::kfUpdator_ [private]

Definition at line 80 of file ConvBremSeedProducer.h.

Referenced by beginJob(), endJob(), and produce().

std::vector<const DetLayer*> ConvBremSeedProducer::layerMap_ [private]

Definition at line 83 of file ConvBremSeedProducer.h.

Referenced by detLayer(), and initializeLayerMap().

const MagneticField* ConvBremSeedProducer::magfield_ [private]

Definition at line 77 of file ConvBremSeedProducer.h.

Referenced by beginJob(), and produce().

int ConvBremSeedProducer::negLayerOffset_ [private]

Definition at line 84 of file ConvBremSeedProducer.h.

Referenced by detLayer().

const PropagatorWithMaterial* ConvBremSeedProducer::propagator_ [private]

Definition at line 79 of file ConvBremSeedProducer.h.

Referenced by beginJob(), endJob(), and produce().

std::vector<const DetLayer*> ConvBremSeedProducer::theLayerMap [private]

Definition at line 59 of file ConvBremSeedProducer.h.

const TrackerGeometry* ConvBremSeedProducer::tracker_ [private]

Definition at line 76 of file ConvBremSeedProducer.h.

Referenced by beginJob(), and produce().

const TrajectoryStateTransform* ConvBremSeedProducer::transformer_ [private]

Definition at line 82 of file ConvBremSeedProducer.h.

Referenced by beginJob(), endJob(), and produce().


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