CMS 3D CMS Logo

/afs/cern.ch/work/a/aaltunda/public/www/CMSSW_6_2_7/src/RecoParticleFlow/PFSimProducer/plugins/ConvBremSeedProducer.cc

Go to the documentation of this file.
00001 #include "RecoParticleFlow/PFSimProducer/plugins/ConvBremSeedProducer.h"
00002 #include "FWCore/Framework/interface/ESHandle.h"
00003 
00005 #include "FastSimulation/TrackerSetup/interface/TrackerInteractionGeometryRecord.h"
00006 #include "Geometry/Records/interface/TrackerDigiGeometryRecord.h"
00007 #include "RecoTracker/Record/interface/TrackerRecoGeometryRecord.h"
00008 #include "MagneticField/Records/interface/IdealMagneticFieldRecord.h"
00009 #include "FastSimulation/ParticlePropagator/interface/MagneticFieldMapRecord.h"
00010 #include "TrackingTools/Records/interface/TransientRecHitRecord.h" 
00011 
00013 #include "FastSimulation/TrackerSetup/interface/TrackerInteractionGeometry.h"
00014 #include "Geometry/TrackerGeometryBuilder/interface/TrackerGeometry.h"
00015 #include "MagneticField/Engine/interface/MagneticField.h"
00016 #include "RecoTracker/TransientTrackingRecHit/interface/TkTransientTrackingRecHitBuilder.h"
00017 
00019 #include "DataFormats/TrajectorySeed/interface/TrajectorySeedCollection.h"
00020 #include "DataFormats/ParticleFlowReco/interface/ConvBremSeed.h"
00021 #include "DataFormats/ParticleFlowReco/interface/ConvBremSeedFwd.h"
00022 #include "DataFormats/ParticleFlowReco/interface/GsfPFRecTrackFwd.h"
00023 #include "DataFormats/ParticleFlowReco/interface/GsfPFRecTrack.h"
00024 #include "DataFormats/GsfTrackReco/interface/GsfTrack.h"
00025 #include "DataFormats/ParticleFlowReco/interface/PFBrem.h"
00026 #include "DataFormats/ParticleFlowReco/interface/PFCluster.h"
00027 #include "DataFormats/TrackingRecHit/interface/TrackingRecHit.h"
00028 
00030 #include "TrackingTools/DetLayers/interface/DetLayer.h"
00031 #include "TrackingTools/DetLayers/interface/BarrelDetLayer.h"
00032 #include "TrackingTools/DetLayers/interface/ForwardDetLayer.h"
00033 #include "DataFormats/GeometrySurface/interface/Surface.h"
00034 #include "DataFormats/GeometrySurface/interface/TangentPlane.h"
00035 #include "DataFormats/TrajectorySeed/interface/TrajectorySeed.h"
00036 #include "FastSimulation/ParticlePropagator/src/ParticlePropagator.cc"
00037 #include "TrackingTools/GeomPropagators/interface/AnalyticalPropagator.h"
00038 #include "FastSimulation/TrajectoryManager/interface/InsideBoundsMeasurementEstimator.h"
00039 #include "FastSimulation/TrajectoryManager/interface/LocalMagneticField.h"
00040 #include "RecoTracker/TkSeedGenerator/interface/FastHelix.h"
00041 #include "TrackingTools/MaterialEffects/interface/PropagatorWithMaterial.h"
00042 #include "TrackingTools/KalmanUpdators/interface/KFUpdator.h"
00043 #include "TrackingTools/TrajectoryState/interface/TrajectoryStateTransform.h"
00044 
00045 #include "FWCore/MessageLogger/interface/MessageLogger.h"
00046 
00047 using namespace edm;
00048 using namespace std;
00049 using namespace reco;
00050 
00051 ConvBremSeedProducer::ConvBremSeedProducer(const ParameterSet& iConfig):
00052   conf_(iConfig),
00053   fieldMap_(0),
00054   layerMap_(56, static_cast<const DetLayer*>(0)),
00055   negLayerOffset_(27)
00056 {
00057   produces<ConvBremSeedCollection>();
00058 }
00059 
00060 
00061 ConvBremSeedProducer::~ConvBremSeedProducer()
00062 {
00063  
00064 
00065 }
00066 
00067 
00068 void
00069 ConvBremSeedProducer::produce(Event& iEvent, const EventSetup& iSetup)
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(unsigned int 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            StDetMatch DetMatch = (rphirecHits.product())->find((detid));
00207            MatDetMatch MDetMatch =(matchedrecHits.product())->find((detid));
00208            
00209                 
00210            long int DetID=(DetMatch != rphirecHits->end())? detid:0;
00211 
00212            if ((MDetMatch != matchedrecHits->end()) && !MDetMatch->empty()) {
00213              long int pii = MDetMatch->begin()->monoId();
00214              StDetMatch CDetMatch = (rphirecHits.product())->find((pii));
00215              DetID=(CDetMatch != rphirecHits->end())? pii:0;
00216              
00217            }
00218 
00219            temp.push_back(DetID);
00220            
00221          }
00222          else{
00223            PiDetMatch DetMatch = (pixelHits.product())->find((detid));
00224            long int DetID=(DetMatch != pixelHits->end())? detid:0;
00225            temp.push_back(DetID);
00226         
00227         
00228          }
00229        }
00230 
00231        Idd.push_back(temp);
00232 
00233       }//END TRACKER LAYER LOOP
00234       if(Idd.size()<2)continue;
00235 
00237       for (unsigned int i=0;i<Idd.size()-2;i++){
00238         for (unsigned int i1=0;i1<Idd[i].size();i1++){
00239           for (unsigned int i2=0;i2<Idd[i+1].size();i2++){
00240             for (unsigned int i3=0;i3<Idd[i+2].size();i3++){
00241               if ((Idd[i][i1]!=0) &&(Idd[i+1][i2]!=0) &&(Idd[i+2][i3]!=0) ){
00242                 vector<long int >tmp;
00243                 tmp.push_back(Idd[i][i1]);  tmp.push_back(Idd[i+1][i2]); tmp.push_back(Idd[i+2][i3]);
00244                 
00245                 bool newTrip=true;
00246                 for (unsigned int iv=0;iv<tripl.size();iv++){
00247                   if((tripl[iv][0]==tmp[0])&&(tripl[iv][1]==tmp[1])&&(tripl[iv][2]==tmp[2])) newTrip=false;
00248 
00249                 }
00250                 if (newTrip){
00251 
00252                   tripl.push_back(tmp);
00253                 }
00254               }
00255             }     
00256           }       
00257         }
00258       }
00259     }//END BREM LOOP
00260 
00261     float sineta_brem =sinh(eta_br);
00262     
00263 
00264     //OUTPUT COLLECTION
00265     edm::ESHandle<MagneticField> bfield;
00266     iSetup.get<IdealMagneticFieldRecord>().get(bfield);
00267     float nomField = bfield->nominalValue();
00268  
00269 
00270     TransientTrackingRecHit::ConstRecHitContainer glob_hits;
00271     OwnVector<TrackingRecHit> loc_hits;
00272     for (unsigned int i=0;i<tripl.size();i++){
00273       StDetMatch DetMatch1 = (rphirecHits.product())->find(tripl[i][0]);
00274       StDetMatch DetMatch2 = (rphirecHits.product())->find(tripl[i][1]);
00275       StDetMatch DetMatch3 = (rphirecHits.product())->find(tripl[i][2]);
00276       if ((DetMatch1 == rphirecHits->end()) ||
00277           (DetMatch2 == rphirecHits->end()) ||
00278           (DetMatch3 == rphirecHits->end()) )  continue;
00279       StDetSet DetSet1 = *DetMatch1;
00280       StDetSet DetSet2 = *DetMatch2;
00281       StDetSet DetSet3 = *DetMatch3;
00282 
00283       for (StDetSet::const_iterator it1=DetSet1.begin();it1!=DetSet1.end();++it1){
00284         GlobalPoint gp1=tracker_->idToDet(tripl[i][0])->surface().
00285           toGlobal(it1->localPosition());
00286 
00287         bool tak1=isGsfTrack(gsfRecHits,&(*it1));
00288         
00289         for (StDetSet::const_iterator it2=DetSet2.begin();it2!=DetSet2.end();++it2){
00290           GlobalPoint gp2=tracker_->idToDet(tripl[i][1])->surface().
00291             toGlobal(it2->localPosition());
00292           bool tak2=isGsfTrack(gsfRecHits,&(*it2));
00293 
00294           for (StDetSet::const_iterator it3=DetSet3.begin();it3!=DetSet3.end();++it3){
00295             //  ips++;
00296             GlobalPoint gp3=tracker_->idToDet(tripl[i][2])->surface().
00297               toGlobal(it3->localPosition());    
00298             bool tak3=isGsfTrack(gsfRecHits,&(*it3));  
00299             
00300 
00301             FastHelix helix(gp3, gp2, gp1,nomField,&*bfield);
00302             GlobalVector gv=helix.stateAtVertex().momentum();
00303             GlobalVector gv_corr(gv.x(),gv.y(),gv.perp()*sineta_brem);
00304             float ene= sqrt(gv_corr.mag2()+(pfmass*pfmass));
00305 
00306             GlobalPoint gp=helix.stateAtVertex().position();
00307             float ch=helix.stateAtVertex().charge();
00308 
00309 
00310 
00311 
00312             XYZTLorentzVector mom = XYZTLorentzVector(gv.x(),gv.y(),gv_corr.z(),ene);
00313             XYZTLorentzVector pos = XYZTLorentzVector(gp.x(),gp.y(),gp.z(),0.);
00314             BaseParticlePropagator theOutParticle(RawParticle(mom,pos),0,0,B_.z());
00315             theOutParticle.setCharge(ch);
00316             int bgc=GoodCluster(theOutParticle,PPP,0.3,true);
00317 
00318             if (gv.perp()<0.5) continue;
00319 
00320             if (tak1+tak2+tak3>2) continue;
00321 
00322             if (bgc==-1) continue;
00323             bool clTak=false;
00324             for (unsigned int igcc=0; igcc<gc.size(); igcc++){
00325               if (clTak) continue;
00326               if (bgc==gc[igcc]) clTak=true;
00327             }
00328             if (clTak) continue;
00329 
00330 
00331 
00332 
00333             GlobalTrajectoryParameters Gtp(gp1,
00334                                            gv,int(ch), 
00335                                            &(*magfield_));
00336             glob_hits.clear(); loc_hits.clear();
00337             glob_hits.push_back(hitBuilder_->build(it1->clone()));
00338             glob_hits.push_back(hitBuilder_->build(it2->clone()));
00339             glob_hits.push_back(hitBuilder_->build(it3->clone()));
00340 
00342 
00343             FreeTrajectoryState CSeed(Gtp,
00344                                       CurvilinearTrajectoryError(AlgebraicSymMatrix55(AlgebraicMatrixID())));
00345             TrajectoryStateOnSurface updatedState;        
00346   
00347             for (int ih=0;ih<3;ih++){
00348 
00349               TrajectoryStateOnSurface state = (ih==0)?
00350                 propagator_->propagate(CSeed,
00351                                        tracker_->idToDet(tripl[i][ih])->surface()):
00352                 propagator_->propagate(updatedState,
00353                                        tracker_->idToDet(tripl[i][ih])->surface());
00354               
00355               if (!state.isValid()){ 
00356                 ih=3;
00357                 continue;}
00358 
00359               updatedState =  kfUpdator_->update(state, *glob_hits[ih]);
00360               loc_hits.push_back(glob_hits[ih]->hit()->clone());
00361               if (ih==2){
00362                 PTrajectoryStateOnDet const & PTraj= 
00363                   trajectoryStateTransform::persistentState(updatedState,tripl[i][2]);
00364                 //              output->push_back(Trajectoryseed(PTraj,loc_hits,alongMomentum));
00365                 unclean.push_back(make_pair(TrajectorySeed(PTraj,loc_hits,alongMomentum), 
00366                                             make_pair(gv_corr,ch)));
00367               }
00368               //    }
00369 
00370             }
00371           }    
00372         }    
00373       }
00374     }
00375     vector<bool> inPhot = sharedHits(unclean);
00376     for (unsigned int iu=0; iu<unclean.size();iu++){
00377 
00378       if (inPhot[iu])
00379         output->push_back(ConvBremSeed(unclean[iu].first,pft));
00380 
00381     }
00382 
00383   } //END GSF TRACK COLLECTION LOOP 
00384   LogDebug("ConvBremSeedProducerProducer")<<"END";
00385   iEvent.put(output);
00386     
00387 }
00388 
00389 
00390 void 
00391 ConvBremSeedProducer::beginRun(const edm::Run& run,
00392                                const EventSetup& iSetup)
00393 {
00394   ESHandle<GeometricSearchTracker> track;
00395   iSetup.get<TrackerRecoGeometryRecord>().get( track ); 
00396   geomSearchTracker_ = track.product();
00397   
00398   ESHandle<TrackerInteractionGeometry>  theTrackerInteractionGeometry;
00399   iSetup.get<TrackerInteractionGeometryRecord>().get(theTrackerInteractionGeometry );
00400   geometry_=theTrackerInteractionGeometry.product();
00401 
00402   ESHandle<TrackerGeometry> tracker;
00403   iSetup.get<TrackerDigiGeometryRecord>().get(tracker);
00404   tracker_=tracker.product();
00405 
00406   ESHandle<MagneticField> magfield;
00407   iSetup.get<IdealMagneticFieldRecord>().get(magfield);
00408   magfield_=magfield.product();
00409   B_=magfield_->inTesla(GlobalPoint(0,0,0));
00410 
00411   ESHandle<MagneticFieldMap> fieldMap;
00412   iSetup.get<MagneticFieldMapRecord>().get(fieldMap);
00413   fieldMap_ =fieldMap.product();
00414 
00415 
00416 
00417   ESHandle<TransientTrackingRecHitBuilder> hitBuilder;
00418   iSetup.get<TransientRecHitRecord>().get(conf_.getParameter<string>("TTRHBuilder"),hitBuilder);
00419   hitBuilder_= hitBuilder.product();
00420 
00421   propagator_  =    new PropagatorWithMaterial(alongMomentum,0.0005,&(*magfield) );
00422   kfUpdator_   =    new KFUpdator();
00423 }
00424 
00425 void 
00426 ConvBremSeedProducer::endRun(const edm::Run& run,
00427                              const EventSetup& iSetup) {
00428   delete propagator_;
00429   delete kfUpdator_;
00430 }
00431 
00432 void 
00433 ConvBremSeedProducer::initializeLayerMap()
00434 {
00435 
00436 
00437   // These are the BoundSurface&, the BoundDisk* and the BoundCylinder* for that layer
00438   //   const BoundSurface& theSurface = layer.surface();
00439   //   BoundDisk* theDisk = layer.disk();  // non zero for endcaps
00440   //   BoundCylinder* theCylinder = layer.cylinder(); // non zero for barrel
00441   //   int theLayer = layer.layerNumber(); // 1->3 PixB, 4->5 PixD, 
00442   //                                       // 6->9 TIB, 10->12 TID, 
00443   //                                       // 13->18 TOB, 19->27 TEC
00444   
00447     
00448     std::vector< BarrelDetLayer*>   barrelLayers = 
00449       geomSearchTracker_->barrelLayers();
00450     LogDebug("FastTracker") << "Barrel DetLayer dump: ";
00451     for (std::vector< BarrelDetLayer*>::const_iterator bl=barrelLayers.begin();
00452          bl != barrelLayers.end(); ++bl) {
00453       LogDebug("FastTracker")<< "radius " << (**bl).specificSurface().radius(); 
00454     }
00455 
00456   std::vector< ForwardDetLayer*>  posForwardLayers = 
00457     geomSearchTracker_->posForwardLayers();
00458   LogDebug("FastTracker") << "Positive Forward DetLayer dump: ";
00459   for (std::vector< ForwardDetLayer*>::const_iterator fl=posForwardLayers.begin();
00460        fl != posForwardLayers.end(); ++fl) {
00461     LogDebug("FastTracker") << "Z pos "
00462                             << (**fl).surface().position().z()
00463                             << " radii " 
00464                             << (**fl).specificSurface().innerRadius() 
00465                             << ", " 
00466                             << (**fl).specificSurface().outerRadius(); 
00467   }
00468 
00469   const float rTolerance = 1.5;
00470   const float zTolerance = 3.;
00471 
00472   LogDebug("FastTracker")<< "Dump of TrackerInteractionGeometry cylinders:";
00473   for( std::list<TrackerLayer>::const_iterator i=geometry_->cylinderBegin();
00474        i!=geometry_->cylinderEnd(); ++i) {
00475     const BoundCylinder* cyl = i->cylinder();
00476     const BoundDisk* disk = i->disk();
00477 
00478     LogDebug("FastTracker") << "Famos Layer no " << i->layerNumber()
00479                             << " is sensitive? " << i->sensitive()
00480                             << " pos " << i->surface().position();
00481     if (!i->sensitive()) continue;
00482 
00483     if (cyl != 0) {
00484 
00485       LogDebug("FastTracker") << " cylinder radius " << cyl->radius();
00486       bool found = false;
00487 
00488       for (std::vector< BarrelDetLayer*>::const_iterator 
00489              bl=barrelLayers.begin(); bl != barrelLayers.end(); ++bl) {
00490 
00491         if (fabs( cyl->radius() - (**bl).specificSurface().radius()) < rTolerance) {
00492 
00493           layerMap_[i->layerNumber()] = *bl;
00494           found = true;
00495           LogDebug("FastTracker")<< "Corresponding DetLayer found with radius "
00496                                  << (**bl).specificSurface().radius();
00497                   
00498           break;
00499         }
00500       }
00501       if (!found) {
00502         LogError("FastTracker") << "FAILED to find a corresponding DetLayer!";
00503       }
00504     }
00505     else {
00506       LogDebug("FastTracker") << " disk radii " << disk->innerRadius() 
00507                  << ", " << disk->outerRadius();
00508 
00509       bool found = false;
00510 
00511       for (std::vector< ForwardDetLayer*>::const_iterator fl=posForwardLayers.begin();
00512            fl != posForwardLayers.end(); ++fl) {
00513         if (fabs( disk->position().z() - (**fl).surface().position().z()) < zTolerance) {
00514           layerMap_[i->layerNumber()] = *fl;
00515           found = true;
00516           LogDebug("FastTracker") << "Corresponding DetLayer found with Z pos "
00517                                   << (**fl).surface().position().z()
00518                                   << " and radii " 
00519                                   << (**fl).specificSurface().innerRadius() 
00520                                   << ", " 
00521                                   << (**fl).specificSurface().outerRadius(); 
00522           break;
00523         }
00524       }
00525       if (!found) {
00526         LogError("FastTracker") << "FAILED to find a corresponding DetLayer!";
00527       }
00528     }
00529   }
00530 
00531 }
00532 const DetLayer*  ConvBremSeedProducer::detLayer( const TrackerLayer& layer, float zpos) const
00533 {
00534   if (zpos > 0 || !layer.forward() ) return layerMap_[layer.layerNumber()];
00535   else return layerMap_[layer.layerNumber()+negLayerOffset_];
00536 }
00537 
00538 TrajectoryStateOnSurface 
00539 ConvBremSeedProducer::makeTrajectoryState( const DetLayer* layer, 
00540                                const ParticlePropagator& pp,
00541                                const MagneticField* field) const
00542 {
00543 
00544   GlobalPoint  pos( pp.X(), pp.Y(), pp.Z());
00545   GlobalVector mom( pp.Px(), pp.Py(), pp.Pz());
00546 
00547   ReferenceCountingPointer<TangentPlane> plane = layer->surface().tangentPlane(pos);
00548 
00549   return TrajectoryStateOnSurface
00550     (GlobalTrajectoryParameters( pos, mom, TrackCharge( pp.charge()), field), *plane);
00551 }
00552 bool ConvBremSeedProducer::isGsfTrack(const TrackingRecHitRefVector& tkv, const TrackingRecHit *h ){
00553   trackingRecHit_iterator ib=tkv.begin();
00554   trackingRecHit_iterator ie=tkv.end();
00555   bool istaken=false;
00556   //  for (;ib!=ie-2;++ib){
00557     for (;ib!=ie;++ib){
00558     if (istaken) continue;
00559     if (!((*ib)->isValid())) continue;
00560  
00561     istaken = (*ib)->sharesInput(h,TrackingRecHit::all);
00562   }
00563   return istaken;
00564 }
00565 vector<bool> ConvBremSeedProducer::sharedHits( const vector<pair< TrajectorySeed, 
00566                                    pair<GlobalVector,float> > >& unclean){
00567 
00568   vector<bool> goodseed;
00569   goodseed.clear();
00570   if (unclean.size()<2){
00571     for (unsigned int i=0;i<unclean.size();i++)
00572       goodseed.push_back(true);
00573   }else{
00574  
00575     for (unsigned int i=0;i<unclean.size();i++)
00576       goodseed.push_back(true);
00577     
00578     for (unsigned int iu=0; iu<unclean.size()-1;iu++){   
00579       if (!goodseed[iu]) continue;
00580       for (unsigned int iu2=iu+1; iu2<unclean.size();iu2++){
00581         if (!goodseed[iu]) continue;
00582         if (!goodseed[iu2]) continue;
00583       //    if (unclean[iu].second.second *unclean[iu2].second.second >0)continue;
00584         
00585         TrajectorySeed::const_iterator sh = unclean[iu].first.recHits().first;
00586         TrajectorySeed::const_iterator sh_end = unclean[iu].first.recHits().second; 
00587         
00588         unsigned int shar =0;
00589         for (;sh!=sh_end;++sh){ 
00590 
00591           TrajectorySeed::const_iterator sh2 = unclean[iu2].first.recHits().first;
00592           TrajectorySeed::const_iterator sh2_end = unclean[iu2].first.recHits().second; 
00593         for (;sh2!=sh2_end;++sh2){
00594 
00595           if ((*sh).sharesInput(&(*sh2),TrackingRecHit::all))
00596 
00597             shar++;
00598 
00599         }
00600         }
00601         if (shar>=2){
00602         if (unclean[iu].second.first.perp()<unclean[iu2].second.first.perp()) goodseed[iu]=false;
00603         else goodseed[iu2]=false;
00604         }
00605       
00606       } 
00607  
00608     }
00609   }
00610   return goodseed;
00611 }
00612 
00613 
00614 
00615 int ConvBremSeedProducer::GoodCluster(const BaseParticlePropagator& ubpg, const PFClusterCollection& pfc, float minep, bool sec){
00616   
00617   BaseParticlePropagator bpg = ubpg;
00618   bpg.propagateToEcalEntrance(false);
00619   float dr=1000;
00620   float de=1000;
00621   float df=1000;
00622   int ibest=-1;
00623 
00624   if(bpg.getSuccess()!=0){
00625 
00626     for (unsigned int i =0; i<pfc.size();i++ ){
00627       float tmp_ep=pfc[i].energy()/bpg.momentum().e();
00628       float tmp_phi=fabs(pfc[i].position().phi()-bpg.vertex().phi());
00629       if (tmp_phi>TMath::TwoPi()) tmp_phi-= TMath::TwoPi(); 
00630       float tmp_eta=fabs(pfc[i].position().eta()-bpg.vertex().eta());
00631       float tmp_dr=sqrt(pow(tmp_phi,2)+pow(tmp_eta,2));
00632       bool isBet=(tmp_dr<dr);
00633       if (sec) isBet=(tmp_phi<df);
00634       if ((isBet)&&(tmp_ep>minep)&&(tmp_ep<10)){
00635         dr=tmp_dr;
00636         de=tmp_eta;
00637         df=tmp_phi; 
00638         ibest=i;
00639       }
00640     }
00641     bool isBad=(dr>0.1);
00642     if (sec) isBad= ((df>0.25) || (de>0.5));
00643 
00644     if (isBad) ibest=-1;
00645 
00646   }
00647   return ibest;
00648 }
00649