CMS 3D CMS Logo

/afs/cern.ch/work/a/aaltunda/public/www/CMSSW_6_2_7/src/SimTracker/TrackAssociation/src/CosmicParametersDefinerForTP.cc

Go to the documentation of this file.
00001 #include "SimTracker/TrackAssociation/interface/CosmicParametersDefinerForTP.h"
00002 #include "FWCore/Utilities/interface/typelookup.h"
00003 #include "DataFormats/GeometryVector/interface/GlobalVector.h"
00004 #include "DataFormats/GeometryVector/interface/GlobalPoint.h"
00005 #include "TrackingTools/TrajectoryState/interface/FreeTrajectoryState.h"
00006 #include "TrackingTools/PatternTools/interface/TSCBLBuilderNoMaterial.h"
00007 #include "TrackingTools/PatternTools/interface/TSCPBuilderNoMaterial.h"
00008 #include "MagneticField/Engine/interface/MagneticField.h" 
00009 #include "MagneticField/Records/interface/IdealMagneticFieldRecord.h"
00010 #include "Geometry/Records/interface/TrackerDigiGeometryRecord.h"
00011 #include <Geometry/TrackerGeometryBuilder/interface/TrackerGeometry.h>
00012 #include <DataFormats/GeometrySurface/interface/Surface.h>
00013 #include <DataFormats/GeometrySurface/interface/GloballyPositioned.h>
00014 #include <Geometry/CommonDetUnit/interface/GeomDet.h>
00015 #include "FWCore/Framework/interface/Event.h"
00016 #include <FWCore/Framework/interface/ESHandle.h>
00017 #include "FWCore/MessageLogger/interface/MessageLogger.h"
00018 
00019 class TrajectoryStateClosestToBeamLineBuilder;
00020 
00021 
00022 TrackingParticle::Vector
00023  CosmicParametersDefinerForTP::momentum(const edm::Event& iEvent, const edm::EventSetup& iSetup, const TrackingParticleRef tpr) const{
00024   // to add a new implementation for cosmic. For the moment, it is just as for the base class:
00025   using namespace edm;
00026   using namespace std;
00027   using namespace reco;
00028 
00029   ESHandle<TrackerGeometry> tracker;
00030   iSetup.get<TrackerDigiGeometryRecord>().get(tracker);
00031   
00032   edm::ESHandle<MagneticField> theMF;
00033   iSetup.get<IdealMagneticFieldRecord>().get(theMF);
00034   
00035   edm::Handle<reco::BeamSpot> bs;
00036   iEvent.getByLabel(InputTag("offlineBeamSpot"),bs);
00037 
00038   // cout<<"TrackingParticle pdgId = "<<tpr->pdgId()<<endl;
00039   // cout<<"with tpr->vertex(): ("<<tpr->vertex().x()<<", "<<tpr->vertex().y()<<", "<<tpr->vertex().z()<<")"<<endl;
00040   // cout<<"with tpr->momentum(): ("<<tpr->momentum().x()<<", "<<tpr->momentum().y()<<", "<<tpr->momentum().z()<<")"<<endl;
00041   
00042   GlobalVector finalGV;
00043   GlobalPoint finalGP;
00044   double radius(9999);
00045   bool found(0);
00046   TrackingParticle::Vector momentum(0,0,0);
00047 
00048   if (simHitsTPAssoc.isValid()==0) {
00049     LogError("TrackAssociation") << "Invalid handle!";
00050     return momentum;
00051   }
00052   std::pair<TrackingParticleRef, TrackPSimHitRef> clusterTPpairWithDummyTP(tpr,TrackPSimHitRef());//SimHit is dummy: for simHitTPAssociationListGreater 
00053                                                                                                  // sorting only the cluster is needed
00054   auto range = std::equal_range(simHitsTPAssoc->begin(), simHitsTPAssoc->end(), 
00055                                 clusterTPpairWithDummyTP, SimHitTPAssociationProducer::simHitTPAssociationListGreater);
00056   for(auto ip = range.first; ip != range.second; ++ip) {
00057     TrackPSimHitRef it = ip->second;
00058     const GeomDet* tmpDet  = tracker->idToDet( DetId(it->detUnitId()) ) ;
00059     LocalVector  lv = it->momentumAtEntry();
00060     Local3DPoint lp = it->localPosition ();
00061     GlobalVector gv = tmpDet->surface().toGlobal( lv );
00062     GlobalPoint  gp = tmpDet->surface().toGlobal( lp );
00063     if(gp.perp()<radius){
00064       found=true;
00065       radius = gp.perp();
00066       finalGV = gv;
00067       finalGP = gp;
00068     }
00069   }
00070 
00071   //cout<<"found = "<<found<<endl;
00072   // cout<<"Closest Hit Position: ("<<finalGP.x()<<", "<<finalGP.y()<<", "<<finalGP.z()<<")"<<endl;
00073   //cout<<"Momentum at Closest Hit to BL: ("<<finalGV.x()<<", "<<finalGV.y()<<", "<<finalGV.z()<<")"<<endl;
00074 
00075   if(found) 
00076     {
00077       FreeTrajectoryState ftsAtProduction(finalGP,finalGV,TrackCharge(tpr->charge()),theMF.product());
00078       TSCBLBuilderNoMaterial tscblBuilder;
00079       TrajectoryStateClosestToBeamLine tsAtClosestApproach = tscblBuilder(ftsAtProduction,*bs);//as in TrackProducerAlgorithm
00080       if(tsAtClosestApproach.isValid()){
00081         GlobalVector p = tsAtClosestApproach.trackStateAtPCA().momentum();
00082         momentum = TrackingParticle::Vector(p.x(), p.y(), p.z());
00083       }
00084       return momentum;
00085     }
00086   return momentum;
00087 }
00088 
00089 TrackingParticle::Point CosmicParametersDefinerForTP::vertex(const edm::Event& iEvent, const edm::EventSetup& iSetup, const TrackingParticleRef tpr) const{
00090   
00091   using namespace edm;
00092   using namespace std;
00093   using namespace reco;
00094 
00095   ESHandle<TrackerGeometry> tracker;
00096   iSetup.get<TrackerDigiGeometryRecord>().get(tracker);
00097   
00098   edm::ESHandle<MagneticField> theMF;
00099   iSetup.get<IdealMagneticFieldRecord>().get(theMF);
00100   
00101   edm::Handle<reco::BeamSpot> bs;
00102   iEvent.getByLabel(InputTag("offlineBeamSpot"),bs);
00103 
00104   GlobalVector finalGV;
00105   GlobalPoint finalGP;
00106   double radius(9999);
00107   bool found(0);
00108   TrackingParticle::Point vertex(0,0,0);
00109 
00110   if (simHitsTPAssoc.isValid()==0) {
00111     LogError("TrackAssociation") << "Invalid handle!";
00112     return vertex;
00113   }
00114   std::pair<TrackingParticleRef, TrackPSimHitRef> clusterTPpairWithDummyTP(tpr,TrackPSimHitRef());//SimHit is dummy: for simHitTPAssociationListGreater 
00115                                                                                                  // sorting only the cluster is needed
00116   auto range = std::equal_range(simHitsTPAssoc->begin(), simHitsTPAssoc->end(), 
00117                                 clusterTPpairWithDummyTP, SimHitTPAssociationProducer::simHitTPAssociationListGreater);
00118   for(auto ip = range.first; ip != range.second; ++ip) {
00119     TrackPSimHitRef it = ip->second;
00120     const GeomDet* tmpDet  = tracker->idToDet( DetId(it->detUnitId()) ) ;
00121     LocalVector  lv = it->momentumAtEntry();
00122     Local3DPoint lp = it->localPosition ();
00123     GlobalVector gv = tmpDet->surface().toGlobal( lv );
00124     GlobalPoint  gp = tmpDet->surface().toGlobal( lp );
00125     if(gp.perp()<radius){
00126       found=true;
00127       radius = gp.perp();
00128       finalGV = gv;
00129       finalGP = gp;
00130     }
00131   }
00132   if(found)
00133     {
00134       FreeTrajectoryState ftsAtProduction(finalGP,finalGV,TrackCharge(tpr->charge()),theMF.product());
00135       TSCBLBuilderNoMaterial tscblBuilder;
00136       TrajectoryStateClosestToBeamLine tsAtClosestApproach = tscblBuilder(ftsAtProduction,*bs);//as in TrackProducerAlgorithm
00137       if(tsAtClosestApproach.isValid()){
00138         GlobalPoint v = tsAtClosestApproach.trackStateAtPCA().position();
00139         vertex = TrackingParticle::Point(v.x()-bs->x0(),v.y()-bs->y0(),v.z()-bs->z0());
00140       }
00141       return vertex;
00142     }
00143   return vertex;
00144 }
00145 
00146 
00147 TYPELOOKUP_DATA_REG(CosmicParametersDefinerForTP);