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
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
00110 vector< vector< long int > > tripl;
00111
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 }
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 }
00260
00261 float sineta_brem =sinh(eta_br);
00262
00263
00264
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
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
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 }
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
00438
00439
00440
00441
00442
00443
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
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
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