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
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
00039
00040
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());
00053
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
00072
00073
00074
00075 if(found)
00076 {
00077 FreeTrajectoryState ftsAtProduction(finalGP,finalGV,TrackCharge(tpr->charge()),theMF.product());
00078 TSCBLBuilderNoMaterial tscblBuilder;
00079 TrajectoryStateClosestToBeamLine tsAtClosestApproach = tscblBuilder(ftsAtProduction,*bs);
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());
00115
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);
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);