Go to the documentation of this file.00001 #include "RecoVZero/VZeroFinding/interface/VZeroFinder.h"
00002
00003 #include "DataFormats/Math/interface/Vector3D.h"
00004
00005 #include "FWCore/MessageLogger/interface/MessageLogger.h"
00006
00007 #include "TrackingTools/PatternTools/interface/TwoTrackMinimumDistance.h"
00008
00009 #include <utility>
00010
00011 VZeroFinder::VZeroFinder
00012 (const edm::EventSetup& es,
00013 const edm::ParameterSet& pset)
00014 {
00015
00016 maxDca = pset.getParameter<double>("maxDca");
00017
00018
00019 minCrossingRadius = pset.getParameter<double>("minCrossingRadius");
00020 maxCrossingRadius = pset.getParameter<double>("maxCrossingRadius");
00021 maxImpactMother = pset.getParameter<double>("maxImpactMother");
00022
00023
00024 edm::ESHandle<MagneticField> magField;
00025 es.get<IdealMagneticFieldRecord>().get(magField);
00026 theMagField = magField.product();
00027 }
00028
00029
00030 VZeroFinder::~VZeroFinder()
00031 {
00032 }
00033
00034
00035 GlobalTrajectoryParameters VZeroFinder::getGlobalTrajectoryParameters
00036 (const reco::Track& track)
00037 {
00038 GlobalPoint position(track.vertex().x(),
00039 track.vertex().y(),
00040 track.vertex().z());
00041
00042 GlobalVector momentum(track.momentum().x(),
00043 track.momentum().y(),
00044 track.momentum().z());
00045
00046 GlobalTrajectoryParameters gtp(position,momentum,
00047 track.charge(),theMagField);
00048
00049 return gtp;
00050 }
00051
00052
00053 GlobalVector VZeroFinder::rotate(const GlobalVector & p, double a)
00054 {
00055 double pt = p.perp();
00056 return GlobalVector( -pt*cos(a), -pt*sin(a), p.z());
00057 }
00058
00059
00060 bool VZeroFinder::checkTrackPair(const reco::Track& posTrack,
00061 const reco::Track& negTrack,
00062 const reco::VertexCollection* vertices,
00063 reco::VZeroData& data)
00064 {
00065
00066
00067
00068
00069
00070
00071
00072 GlobalTrajectoryParameters posGtp = getGlobalTrajectoryParameters(posTrack);
00073 GlobalTrajectoryParameters negGtp = getGlobalTrajectoryParameters(negTrack);
00074
00075
00076 TwoTrackMinimumDistance theMinimum(TwoTrackMinimumDistance::SlowMode);
00077
00078
00079 theMinimum.calculate(posGtp,negGtp);
00080
00081
00082
00083
00084
00085 std::pair<GlobalVector,GlobalVector> momenta;
00086 momenta.first = rotate(posGtp.momentum(), theMinimum.firstAngle() );
00087 momenta.second = rotate(negGtp.momentum(), theMinimum.secondAngle());
00088
00089
00090 float dca = theMinimum.distance();
00091 GlobalPoint crossing = theMinimum.crossingPoint();
00092
00093
00094
00095
00096
00097
00098
00099
00100
00101 if(dca < maxDca &&
00102 crossing.perp() > minCrossingRadius &&
00103 crossing.perp() < maxCrossingRadius)
00104 {
00105
00106 GlobalVector momentum = momenta.first + momenta.second;
00107 float impact = -1.;
00108
00109 if(vertices->size() > 0)
00110 {
00111
00112 for(reco::VertexCollection::const_iterator
00113 vertex = vertices->begin(); vertex!= vertices->end(); vertex++)
00114 {
00115 GlobalVector r(crossing.x(),
00116 crossing.y(),
00117 crossing.z() - vertex->position().z());
00118 GlobalVector p(momentum.x(),momentum.y(),momentum.z());
00119
00120 GlobalVector b = r - (r*p)*p / p.mag2();
00121
00122 float im = b.mag();
00123 if(im < impact || vertex == vertices->begin())
00124 impact = im;
00125 }
00126 }
00127 else
00128 {
00129
00130 GlobalVector r_(crossing.x(),crossing.y(),0);
00131 GlobalVector p_(momentum.x(),momentum.y(),0);
00132
00133 GlobalVector b_ = r_ - (r_*p_)*p_ / p_.mag2();
00134 impact = b_.mag();
00135 }
00136
00137
00138
00139
00140
00141
00142 if(impact < maxImpactMother)
00143 {
00144
00145 float pt =
00146 (momenta.first.cross(momenta.second)).mag()/momentum.mag();
00147 float alpha =
00148 (momenta.first.mag2() - momenta.second.mag2())/momentum.mag2();
00149
00150
00151 data.dca = dca;
00152 data.crossingPoint = crossing;
00153 data.impactMother = impact;
00154 data.armenterosPt = pt;
00155 data.armenterosAlpha = alpha;
00156 data.momenta = momenta;
00157
00158
00159
00160
00161
00162
00163 return true;
00164 }
00165 }
00166
00167 return false;
00168 }
00169