00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014 #include "RecoHI/HiMuonAlgos/interface/HITrackVertexMaker.h"
00015
00016
00017
00018 #include <memory>
00019 #include<iostream>
00020 #include<iomanip>
00021 #include<vector>
00022 #include<cmath>
00023
00024
00025 #include "MagneticField/Records/interface/IdealMagneticFieldRecord.h"
00026 #include "RecoTracker/Record/interface/CkfComponentsRecord.h"
00027 #include "TrackingTools/TransientTrackingRecHit/interface/TransientTrackingRecHitBuilder.h"
00028
00029
00030 #include "L1Trigger/GlobalMuonTrigger/interface/L1MuGlobalMuonTrigger.h"
00031 #include "DataFormats/L1GlobalMuonTrigger/interface/L1MuGMTReadoutRecord.h"
00032 #include "DataFormats/L1GlobalMuonTrigger/interface/L1MuGMTReadoutCollection.h"
00033 #include "DataFormats/L1GlobalMuonTrigger/interface/L1MuRegionalCand.h"
00034 #include "DataFormats/RecoCandidate/interface/RecoChargedCandidate.h"
00035 #include "DataFormats/RecoCandidate/interface/RecoChargedCandidateFwd.h"
00036
00037
00038 #include "DataFormats/TrackReco/interface/Track.h"
00039 #include "TrackingTools/TransientTrack/interface/TransientTrack.h"
00040 #include "DataFormats/RecoCandidate/interface/RecoChargedCandidate.h"
00041 #include "DataFormats/RecoCandidate/interface/RecoChargedCandidateFwd.h"
00042 #include "TrackingTools/Records/interface/TrackingComponentsRecord.h"
00043 #include "TrackingTools/MaterialEffects/interface/PropagatorWithMaterial.h"
00044 #include "TrackingTools/GeomPropagators/interface/StateOnTrackerBound.h"
00045 #include "TrackingTools/TrajectoryState/interface/TrajectoryStateOnSurface.h"
00046 #include "TrackingTools/Records/interface/TransientRecHitRecord.h"
00047 #include "TrackingTools/Records/interface/TrackingComponentsRecord.h"
00048 #include "TrackingTools/TrajectoryFiltering/interface/RegionalTrajectoryFilter.h"
00049 #include "TrackingTools/PatternTools/interface/TrajectoryMeasurement.h"
00050 #include "DataFormats/TrajectorySeed/interface/TrajectorySeedCollection.h"
00051 #include "RecoTracker/TkNavigation/interface/NavigationSchoolFactory.h"
00052 #include "DataFormats/TrackReco/interface/TrackBase.h"
00053 #include "RecoVertex/VertexPrimitives/interface/TransientVertex.h"
00054 #include "DataFormats/VertexReco/interface/VertexFwd.h"
00055 #include "DataFormats/VertexReco/interface/Vertex.h"
00056 #include "RecoVertex/KalmanVertexFit/interface/KalmanVertexFitter.h"
00057
00058 #include "TrackingTools/PatternTools/interface/TSCBLBuilderNoMaterial.h"
00059 #include "RecoTracker/TkNavigation/interface/SimpleNavigationSchool.h"
00060 #include "TrackingTools/DetLayers/interface/NavigationSetter.h"
00061 #include "TrackingTools/DetLayers/interface/NavigationSchool.h"
00062 #include "DataFormats/BeamSpot/interface/BeamSpot.h"
00063 #include "DataFormats/TrackReco/interface/TrackBase.h"
00064 #include "TrackingTools/PatternTools/interface/TrajectorySmoother.h"
00065 #include "TrackingTools/TrackFitters/interface/TrajectoryFitter.h"
00066
00067
00068
00069 #include "Geometry/CommonDetUnit/interface/GeomDetType.h"
00070 #include "Geometry/CommonDetUnit/interface/GeomDet.h"
00071 #include "Geometry/CommonDetUnit/interface/GeomDetUnit.h"
00072 #include "Geometry/TrackerGeometryBuilder/interface/GluedGeomDet.h"
00073 #include "Geometry/TrackerGeometryBuilder/interface/TrackerGeometry.h"
00074 #include "Geometry/Records/interface/TrackerDigiGeometryRecord.h"
00075 #include "Geometry/TrackerNumberingBuilder/interface/GeometricDet.h"
00076 #include "Geometry/CommonDetUnit/interface/GlobalTrackingGeometry.h"
00077 #include "Geometry/Records/interface/GlobalTrackingGeometryRecord.h"
00078
00079
00080
00081 #include "RecoHI/HiMuonAlgos/interface/HICFTSfromL1orL2.h"
00082 #include "RecoHI/HiMuonAlgos/interface/HICConst.h"
00083 #include "RecoHI/HiMuonAlgos/interface/FastMuPropagator.h"
00084 #include "RecoHI/HiMuonAlgos/interface/FmpConst.h"
00085 #include "RecoHI/HiMuonAlgos/interface/HICTkOuterStartingLayerFinder.h"
00086 #include "RecoHI/HiMuonAlgos/interface/DiMuonSeedGeneratorHIC.h"
00087 #include "RecoHI/HiMuonAlgos/interface/HICTrajectoryBuilder.h"
00088 #include "RecoHI/HiMuonAlgos/interface/HICSimpleNavigationSchool.h"
00089 #include "RecoHI/HiMuonAlgos/interface/HICMuonUpdator.h"
00090 #include "RecoHI/HiMuonAlgos/interface/HICConst.h"
00091
00092
00093
00094 #include "DataFormats/GeometryVector/interface/LocalPoint.h"
00095 #include "DataFormats/GeometryVector/interface/GlobalPoint.h"
00096
00097
00098 #include "TrackingTools/PatternTools/interface/TwoTrackMinimumDistance.h"
00099 #include "TrackingTools/TrajectoryParametrization/interface/GlobalTrajectoryParameters.h"
00100
00101
00102
00103
00104 using namespace reco;
00105 using namespace std;
00106
00107
00108
00109 namespace cms{
00110 HITrackVertexMaker::HITrackVertexMaker(const edm::ParameterSet& ps1, const edm::EventSetup& es1)
00111 {
00112
00113 L2candTag_ = ps1.getParameter< edm::InputTag > ("L2CandTag");
00114 rphirecHitsTag = ps1.getParameter< edm::InputTag > ("rphiRecHits");
00115 builderName = ps1.getParameter< std::string > ("TTRHBuilder");
00116 primaryVertexTag = ps1.getParameter< edm::InputTag > ("PrimaryVertexTag");
00117 #ifdef DEBUG
00118 std::cout<<" Start HI TrackVertexMaker constructor "<<std::endl;
00119 #endif
00120 pset_ = ps1;
00121 std::cout<<" No initialization "<<std::endl;
00122 eventCount = 0;
00123 #ifdef DEBUG
00124 std::cout<<" HICTrajectoryBuilder constructed "<<std::endl;
00125 #endif
00126 }
00127
00128
00129
00130
00131
00132 HITrackVertexMaker::~HITrackVertexMaker()
00133 {
00134
00135 }
00136
00137 bool HITrackVertexMaker::produceTracks(const edm::Event& e1, const edm::EventSetup& es1, HICConst* theHICConst, FmpConst* theFmpConst)
00138 {
00139 bool dimuon = false;
00140
00141 edm::Handle<RecoChargedCandidateCollection> L2mucands;
00142
00143 e1.getByLabel (L2candTag_,L2mucands);
00144
00145 #ifdef DEBUG
00146 cout<<" Number of muon candidates "<<L2mucands->size()<<endl;
00147 if( L2mucands->size() < 2 ) cout<<"L2 muon failed"<<endl;
00148 #endif
00149
00150 if( L2mucands->size() < 2 ) return dimuon;
00151
00152 #ifdef DEBUG
00153 cout<<"L2 muon accepted"<<endl;
00154 #endif
00155
00156 edm::Handle<reco::VertexCollection> vertexcands;
00157 e1.getByLabel (primaryVertexTag,vertexcands);
00158
00159 #ifdef DEBUG
00160 cout<<" Number of vertices primary "<<vertexcands->size()<<endl;
00161 if(vertexcands->size()<1) cout<<" Primary vertex failed "<<endl;
00162 #endif
00163
00164 if(vertexcands->size()<1) return dimuon;
00165
00166 #ifdef DEBUG_COUNT
00167 cout<<" Accepted for L3 propagation "<<endl;
00168 #endif
00169
00170
00171 int iv = 0;
00172 for (reco::VertexCollection::const_iterator ipvertex=vertexcands->begin();ipvertex!=vertexcands->end();ipvertex++)
00173 {
00174
00175 if (iv == 0) {theHICConst->setVertex((*ipvertex).position().z()); theFmpConst->setVertex((*ipvertex).position().z());}
00176 iv++;
00177 }
00178
00179
00180
00181 eventCount++;
00182
00183
00184
00185 std::string updatorName = "KFUpdator";
00186 std::string propagatorAlongName = "PropagatorWithMaterial";
00187 std::string propagatorOppositeName = "PropagatorWithMaterialOpposite";
00188 double theChiSquareCut = 500.;
00189 double nsig = 3.;
00190 double ptmin=1.;
00191
00192
00193 edm::ESHandle<MagneticField> magfield;
00194 edm::ESHandle<TransientTrackingRecHitBuilder> recHitBuilderHandle;
00195 edm::ESHandle<MeasurementTracker> measurementTrackerHandle;
00196 edm::ESHandle<GeometricSearchTracker> tracker;
00197 edm::ESHandle<Propagator> propagatorAlongHandle;
00198 edm::ESHandle<Propagator> propagatorOppositeHandle;
00199 edm::ESHandle<TrajectoryStateUpdator> updatorHandle;
00200
00201 es1.get<TrackerRecoGeometryRecord>().get( tracker );
00202 es1.get<IdealMagneticFieldRecord>().get(magfield);
00203 es1.get<CkfComponentsRecord>().get("",measurementTrackerHandle);
00204 es1.get<TransientRecHitRecord>().get(builderName,recHitBuilderHandle);
00205 es1.get<TrackingComponentsRecord>().get(propagatorAlongName,propagatorAlongHandle);
00206 es1.get<TrackingComponentsRecord>().get(propagatorOppositeName,propagatorOppositeHandle);
00207 es1.get<TrackingComponentsRecord>().get(updatorName,updatorHandle);
00208
00209
00210
00211 if(eventCount == 1) {
00212
00213 int lost=-1;
00214 int lostf=-1;
00215 theNavigationSchoolV.push_back(new HICSimpleNavigationSchool(&(*tracker), &(*magfield), lost, lostf));
00216 for(int i=11;i>-1;i--) {
00217 theNavigationSchoolV.push_back(new HICSimpleNavigationSchool(&(*tracker), &(*magfield), i, lostf));
00218 }
00219 lost=-1;
00220 for(int i=12;i>-1;i--) {
00221 theNavigationSchoolV.push_back(new HICSimpleNavigationSchool(&(*tracker), &(*magfield), lost, i));
00222 }
00223
00224 }
00225
00226
00227
00228 MinPtTrajectoryFilter theMinPtFilter(ptmin);
00229 HICMeasurementEstimator theEstimator(&(*tracker), &(*magfield), theChiSquareCut, nsig);
00230
00231
00232 HICTrajectoryBuilder theTrajectoryBuilder( pset_, es1,
00233 updatorHandle.product(),
00234 propagatorAlongHandle.product(),
00235 propagatorOppositeHandle.product(),
00236 &theEstimator,
00237 recHitBuilderHandle.product(),
00238 measurementTrackerHandle.product(),
00239 &theMinPtFilter);
00240
00241
00242
00243
00244
00245 measurementTrackerHandle->update(e1);
00246
00247 #ifdef DEBUG
00248 std::cout<<" After first tracker update "<<std::endl;
00249 #endif
00250
00251
00252
00253 int theLowMult = 1;
00254 theEstimator.setHICConst(theHICConst);
00255 theEstimator.setMult(theLowMult);
00256
00257
00258 theTrajectoryBuilder.settracker(measurementTrackerHandle.product());
00259
00260
00261
00262
00263
00264 FastMuPropagator theFmp(&(*magfield),theFmpConst);
00265 StateOnTrackerBound state(&theFmp);
00266
00267 TrajectoryStateOnSurface tsos;
00268
00269
00270 HICFTSfromL1orL2 vFts(&(*magfield));
00271
00272
00273 int NumOfSigma=4;
00274 HICTkOuterStartingLayerFinder TkOSLF(NumOfSigma, &(*magfield), &(*tracker), theHICConst);
00275
00276 int mult = 1;
00277 DiMuonSeedGeneratorHIC Seed(rphirecHitsTag,&(*magfield),&(*tracker), theHICConst, builderName, mult);
00278
00279
00280
00281 vector<FreeTrajectoryState> theFts = vFts.createFTSfromL2((*L2mucands));
00282
00283 #ifdef DEBUG
00284 cout<<" Size of the freeTS "<<theFts.size()<<endl;
00285 #endif
00286
00287
00288
00289 DiMuonSeedGeneratorHIC::SeedContainer myseeds;
00290 map<DetLayer*, DiMuonSeedGeneratorHIC::SeedContainer> seedmap;
00291 vector<Trajectory> theTmpTrajectories0;
00292
00293
00294
00295 vector<FreeTrajectoryState*> theFoundFts;
00296 map<FreeTrajectoryState*, vector<Trajectory> > theMapFtsTraj;
00297
00298
00299 for(vector<FreeTrajectoryState>::iterator ifts=theFts.begin(); ifts!=theFts.end(); ifts++)
00300 {
00301 theTmpTrajectories0.clear();
00302 #ifdef DEBUG
00303 cout<<" cycle on Muon Trajectory State " <<(*ifts).parameters().position().perp()<<
00304 " " <<(*ifts).parameters().position().z() <<endl;
00305 #endif
00306
00307 tsos=state((*ifts));
00308 if(tsos.isValid())
00309 {
00310
00311
00312 #ifdef DEBUG
00313 cout<<" Position "<<tsos.globalPosition().perp()<<" "<<tsos.globalPosition().phi()<<
00314 " "<<tsos.globalPosition().z()<<" "<<tsos.globalMomentum().perp()<<endl;
00315 #endif
00316
00317
00318 FreeTrajectoryState* ftsnew=tsos.freeTrajectoryState();
00319 vector<DetLayer*> seedlayers = TkOSLF.startingLayers((*ftsnew));
00320
00321 #ifdef DEBUG
00322 std::cout<<" The size of the starting layers "<<seedlayers.size()<<std::endl;
00323 #endif
00324
00325 if( seedlayers.size() == 0 ) {
00326 #ifdef DEBUG
00327 cout<<" Starting layers failed for muon candidate "<<endl;
00328 #endif
00329 continue;
00330 }
00331 map<DetLayer*, DiMuonSeedGeneratorHIC::SeedContainer> seedmap = Seed.produce(e1 ,es1,
00332 (*ftsnew), tsos, (*ifts),
00333 recHitBuilderHandle.product(),
00334 measurementTrackerHandle.product(),
00335 &seedlayers);
00336
00337
00338
00339 for( vector<DetLayer*>::iterator it = seedlayers.begin(); it != seedlayers.end(); it++)
00340 {
00341
00342 DiMuonSeedGeneratorHIC::SeedContainer seeds = (*seedmap.find(*it)).second;
00343
00344 #ifdef DEBUG
00345 std::cout<<" Layer::Position z "<<(**it).surface().position().z()<<
00346 " Number of seeds in layer "<<seeds.size()<<std::endl;
00347 #endif
00348
00349 if(seeds.size() == 0) {
00350 #ifdef DEBUG
00351 std::cout<<" No seeds are found: do not continue with this Detlayer "<<std::endl;
00352 #endif
00353 continue;
00354 }
00355
00356
00357 NavigationSetter setter( *(theNavigationSchoolV[0]));
00358
00359 for(DiMuonSeedGeneratorHIC::SeedContainer::iterator iseed=seeds.begin();
00360 iseed!=seeds.end();iseed++)
00361 {
00362 std::vector<TrajectoryMeasurement> theV = (*iseed).measurements();
00363
00364 #ifdef DEBUG
00365 std::cout<< "RecHIT Layer position r "<<
00366 theV[0].recHit()->globalPosition().perp()<<" phi "<<
00367 theV[0].recHit()->globalPosition().phi()<<" z "<<
00368 theV[0].recHit()->globalPosition().z()<<" momentum "<<
00369 theV[0].updatedState().freeTrajectoryState()->parameters().momentum().perp()<<" "<<
00370 theV[0].updatedState().freeTrajectoryState()->parameters().momentum().z()<<std::endl;
00371 #endif
00372
00373 vector<Trajectory> theTmpTrajectories = theTrajectoryBuilder.trajectories(*iseed);
00374
00375 #ifdef DEBUG
00376 cout<<" Number of found trajectories "<<theTmpTrajectories.size()<<endl;
00377 #endif
00378 if(theTmpTrajectories.size()>0) {
00379
00380 theTmpTrajectories0.insert(theTmpTrajectories0.end(),
00381 theTmpTrajectories.begin(),
00382 theTmpTrajectories.end());
00383 #ifdef DEBUG
00384 std::cout<<"We found trajectories for at least one seed "<<theTmpTrajectories0.size()<<std::endl;
00385 #endif
00386 break;
00387 }
00388 }
00389
00390 if( theTmpTrajectories0.size() > 0 ) {
00391 #ifdef DEBUG
00392 std::cout<<"We found trajectories for at least one seed "<<theTmpTrajectories0.size()<<"break layer cycle "<<std::endl;
00393 #endif
00394 break;
00395 }
00396 }
00397
00398 if( theTmpTrajectories0.size() > 0 ) {
00399 #ifdef DEBUG
00400 std::cout<<"We found trajectories for at least one seed "<<theTmpTrajectories0.size()
00401 <<"continue"<<std::endl;
00402 #endif
00403 theFoundFts.push_back(&(*ifts));
00404 theMapFtsTraj[&(*ifts)] = theTmpTrajectories0;
00405 continue;
00406 }
00407
00408 #ifdef DEBUG
00409 std::cout<<"No trajectories for this FTS "<<theTmpTrajectories0.size()<<
00410 "try second path"<<std::endl;
00411 #endif
00412
00413
00414
00415
00416
00417 for( vector<DetLayer*>::iterator it = seedlayers.begin(); it != seedlayers.end(); it++)
00418 {
00419
00420 DiMuonSeedGeneratorHIC::SeedContainer seeds = (*seedmap.find(*it)).second;
00421
00422 if(seeds.size() == 0) {
00423 #ifdef DEBUG
00424 std::cout<<" Second path: No seeds are found: do not continue with this Detlayer "<<std::endl;
00425 #endif
00426 continue;
00427 }
00428
00429 if((**it).location() == GeomDetEnumerators::endcap) {
00430 for(unsigned int j=13; j<theNavigationSchoolV.size();j++){
00431 NavigationSetter setter( *(theNavigationSchoolV[j]));
00432 for(DiMuonSeedGeneratorHIC::SeedContainer::iterator iseed=seeds.begin();
00433 iseed!=seeds.end();iseed++)
00434 {
00435 std::vector<TrajectoryMeasurement> theV = (*iseed).measurements();
00436 vector<Trajectory> theTmpTrajectories = theTrajectoryBuilder.trajectories(*iseed);
00437
00438 if(theTmpTrajectories.size()>0) {
00439
00440 theTmpTrajectories0.insert(theTmpTrajectories0.end(),
00441 theTmpTrajectories.begin(),
00442 theTmpTrajectories.end());
00443 #ifdef DEBUG
00444 std::cout<<"Second path: We found trajectories for at least one seed in barrel layer "<<
00445 theTmpTrajectories0.size()<<std::endl;
00446 #endif
00447 break;
00448 }
00449 }
00450
00451 if( theTmpTrajectories0.size() > 0 ) {
00452 #ifdef DEBUG
00453 std::cout<<"Second path: no trajectories: we try next barrel layer "<<
00454 theTmpTrajectories0.size()<<std::endl;
00455 #endif
00456 break;
00457 }
00458 }
00459 } else {
00460 for(int j=1; j<13;j++){
00461 NavigationSetter setter(*(theNavigationSchoolV[j]));
00462 for(DiMuonSeedGeneratorHIC::SeedContainer::iterator iseed=seeds.begin();
00463 iseed!=seeds.end();iseed++)
00464 {
00465 std::vector<TrajectoryMeasurement> theV = (*iseed).measurements();
00466 vector<Trajectory> theTmpTrajectories = theTrajectoryBuilder.trajectories(*iseed);
00467
00468 if(theTmpTrajectories.size()>0) {
00469
00470 theTmpTrajectories0.insert(theTmpTrajectories0.end(),
00471 theTmpTrajectories.begin(),
00472 theTmpTrajectories.end());
00473 #ifdef DEBUG
00474 std::cout<<"Second path: We found trajectories for at least one seed in barrel layer "<<
00475 theTmpTrajectories0.size()<<std::endl;
00476 #endif
00477 break;
00478 }
00479 }
00480
00481 if( theTmpTrajectories0.size() > 0 ) {
00482 #ifdef DEBUG
00483 std::cout<<
00484 "Second path: We found trajectories for at least one seed in barrel/endcap layer"<<
00485 theTmpTrajectories0.size()<<std::endl;
00486 #endif
00487 break;
00488 }
00489 }
00490 }
00491 if( theTmpTrajectories0.size() > 0 ) {
00492 #ifdef DEBUG
00493 std::cout<<
00494 "Second path: We found trajectories for at least one seed in barrel/endcap layer "
00495 <<
00496 theTmpTrajectories0.size()<<std::endl;
00497 #endif
00498 theFoundFts.push_back(&(*ifts));
00499 theMapFtsTraj[&(*ifts)] = theTmpTrajectories0;
00500 break;
00501 }
00502 }
00503 }
00504 }
00505
00506
00507
00508
00509 #ifdef DEBUG
00510 if(theFoundFts.size()>0 ) {
00511 std::cout<<" Event reconstruction finished with "<<theFoundFts.size()
00512 <<std::endl;}
00513 else {std::cout<<" Event reconstruction::no tracks found"<<std::endl;}
00514 #endif
00515 if(theFoundFts.size()<2) return dimuon;
00516
00517
00518
00519 edm::ESHandle<GlobalTrackingGeometry> globTkGeomHandle;
00520 es1.get<GlobalTrackingGeometryRecord>().get(globTkGeomHandle);
00521
00522 reco::BeamSpot::CovarianceMatrix matrix;
00523 matrix(2,2) = 0.001;
00524 matrix(3,3) = 0.001;
00525
00526 reco::BeamSpot bs( reco::BeamSpot::Point(0., 0., theHICConst->zvert),
00527 0.1,
00528 0.,
00529 0.,
00530 0.,
00531 matrix
00532 );
00533
00534
00535 reco::TrackBase::TrackAlgorithm Algo = reco::TrackBase::undefAlgorithm;
00536
00537
00538 vector<reco::Track> firstTrack;
00539 vector<reco::TransientTrack> firstTransTracks;
00540 vector<reco::TrackRef> firstTrackRefs;
00541 vector<reco::Track> secondTrack;
00542 vector<reco::TransientTrack> secondTransTracks;
00543 vector<reco::TrackRef> secondTrackRefs;
00544
00545 for(vector<FreeTrajectoryState*>::iterator it = theFoundFts.begin(); it!= theFoundFts.end(); it++)
00546 {
00547 vector<Trajectory> first = (*theMapFtsTraj.find(*it)).second;
00548
00549 for(vector<Trajectory>::iterator im=first.begin();im!=first.end(); im++) {
00550
00551 TrajectoryStateOnSurface innertsos;
00552 if (im->direction() == alongMomentum) {
00553 innertsos = im->firstMeasurement().updatedState();
00554 } else {
00555 innertsos = im->lastMeasurement().updatedState();
00556 }
00557
00558
00559
00560 TSCBLBuilderNoMaterial tscblBuilder;
00561
00562
00563 TrajectoryStateClosestToBeamLine tscbl = tscblBuilder(*(innertsos.freeState()),bs);
00564
00565 if (tscbl.isValid()==false) {
00566
00567 continue;
00568 }
00569
00570 GlobalPoint v = tscbl.trackStateAtPCA().position();
00571 math::XYZPoint pos( v.x(), v.y(), v.z() );
00572
00573
00574
00575
00576 if(v.perp() > 0.1 ) continue;
00577 if(fabs(v.z() - theHICConst->zvert ) > 0.4 ) continue;
00578
00579 GlobalVector p = tscbl.trackStateAtPCA().momentum();
00580 math::XYZVector mom( p.x(), p.y(), p.z() );
00581
00582 Track theTrack(im->chiSquared(),
00583 im->ndof(),
00584 pos, mom, tscbl.trackStateAtPCA().charge(),
00585 tscbl.trackStateAtPCA().curvilinearError(),Algo);
00586 TransientTrack tmpTk( theTrack, &(*magfield), globTkGeomHandle );
00587
00588
00589 firstTrack.push_back( theTrack );
00590 firstTransTracks.push_back( tmpTk );
00591 }
00592
00593 if( firstTrack.size() == 0 ) continue;
00594
00595 for(vector<FreeTrajectoryState*>::iterator jt = it+1; jt!= theFoundFts.end(); jt++)
00596 {
00597 vector<Trajectory> second = (*theMapFtsTraj.find(*jt)).second;
00598
00599
00600 for(vector<Trajectory>::iterator im=second.begin();im!=second.end(); im++) {
00601
00602 TrajectoryStateOnSurface innertsos;
00603
00604 if (im->direction() == alongMomentum) {
00605 innertsos = im->firstMeasurement().updatedState();
00606 } else {
00607 innertsos = im->lastMeasurement().updatedState();
00608 }
00609
00610 TSCBLBuilderNoMaterial tscblBuilder;
00611
00612 TrajectoryStateClosestToBeamLine tscbl = tscblBuilder(*(innertsos.freeState()),bs);
00613
00614 if (tscbl.isValid()==false) {
00615
00616 continue;
00617 }
00618
00619 GlobalPoint v = tscbl.trackStateAtPCA().position();
00620 math::XYZPoint pos( v.x(), v.y(), v.z() );
00621
00622
00623
00624
00625 if(v.perp() > 0.1 ) continue;
00626 if(fabs(v.z() - theHICConst->zvert ) > 0.4 ) continue;
00627
00628 GlobalVector p = tscbl.trackStateAtPCA().momentum();
00629 math::XYZVector mom( p.x(), p.y(), p.z() );
00630
00631 Track theTrack(im->chiSquared(),
00632 im->ndof(),
00633 pos, mom, tscbl.trackStateAtPCA().charge(),
00634 tscbl.trackStateAtPCA().curvilinearError(),Algo);
00635 TransientTrack tmpTk( theTrack, &(*magfield), globTkGeomHandle );
00636
00637
00638 secondTrack.push_back( theTrack );
00639 secondTransTracks.push_back( tmpTk );
00640 }
00641 if( secondTrack.size() == 0 ) continue;
00642
00643 }
00644 }
00645
00646
00647 if( firstTrack.size() < 1 || secondTrack.size() < 1 ){
00648 #ifdef DEBUG
00649 cout<<" No enough tracks to get vertex "<<endl;
00650 #endif
00651 return dimuon;
00652 }
00653
00654
00655 bool useRefTrax=true;
00656 KalmanVertexFitter theFitter(useRefTrax);
00657 TransientVertex theRecoVertex;
00658
00659
00660
00661 vector<reco::TransientTrack> theTwoTransTracks;
00662
00663 vector<TransientVertex> theVertexContainer;
00664
00665 for(vector<reco::TransientTrack>::iterator iplus = firstTransTracks.begin();
00666 iplus != firstTransTracks.end(); iplus++)
00667 {
00668 for(vector<reco::TransientTrack>::iterator iminus = secondTransTracks.begin();
00669 iminus != secondTransTracks.end(); iminus++)
00670 {
00671
00672 TwoTrackMinimumDistance ttmd;
00673 bool CAIR_ST = false;
00674 GlobalTrajectoryParameters sta = (*iminus).impactPointState().globalParameters();
00675 GlobalTrajectoryParameters stb = (*iplus).impactPointState().globalParameters();
00676 ClosestApproachInRPhi theIniAlgo;
00677
00678 CAIR_ST = theIniAlgo.calculate( sta, stb );
00679
00680 if(CAIR_ST == 0) continue;
00681
00682 theTwoTransTracks.clear();
00683 theTwoTransTracks.push_back(*iplus);
00684 theTwoTransTracks.push_back(*iminus);
00685 theRecoVertex = theFitter.vertex(theTwoTransTracks);
00686 if( !theRecoVertex.isValid() ) {
00687 continue;
00688 }
00689
00690
00691
00692
00693
00694
00695
00696 if ( theRecoVertex.totalChiSquared() > 0.0002 ) {
00697
00698 continue;
00699 }
00700 if ( theRecoVertex.position().perp() > 0.08 ) {
00701
00702 continue;
00703 }
00704 if ( fabs(theRecoVertex.position().z()-theHICConst->zvert) > 0.06 ) {
00705
00706 continue;
00707 }
00708 double quality = theRecoVertex.normalisedChiSquared();
00709 std::vector<reco::TransientTrack> tracks = theRecoVertex.originalTracks();
00710
00711 for (std::vector<reco::TransientTrack>::iterator ivb = tracks.begin(); ivb != tracks.end(); ivb++)
00712 {
00713 quality = quality * (*ivb).chi2() /(*ivb).ndof();
00714 }
00715 if( quality > 70. ) {
00716
00717 continue;
00718 }
00719 theVertexContainer.push_back(theRecoVertex);
00720
00721 dimuon = true;
00722 break;
00723 }
00724 if(dimuon) break;
00725 }
00726 return dimuon;
00727
00728 }
00729 }
00730
00731