1 |
bendavid |
1.3 |
// $Id: FillerConversionsDecay.cc,v 1.2 2011/03/13 22:15:01 bendavid Exp $
|
2 |
bendavid |
1.1 |
|
3 |
|
|
#include "MitProd/TreeFiller/interface/FillerConversionsDecay.h"
|
4 |
|
|
#include "DataFormats/Common/interface/RefToPtr.h"
|
5 |
|
|
#include "MitEdm/DataFormats/interface/RefToBaseToPtr.h"
|
6 |
|
|
#include "MitAna/DataTree/interface/StableDataCol.h"
|
7 |
|
|
#include "MitAna/DataTree/interface/DecayDataCol.h"
|
8 |
|
|
#include "MitAna/DataTree/interface/DecayParticleCol.h"
|
9 |
|
|
#include "MitAna/DataTree/interface/Names.h"
|
10 |
|
|
#include "MitProd/ObjectService/interface/ObjectService.h"
|
11 |
bendavid |
1.2 |
#include "TrackingTools/IPTools/interface/IPTools.h"
|
12 |
|
|
#include "TrackingTools/TransientTrack/interface/TransientTrackBuilder.h"
|
13 |
|
|
#include "TrackingTools/TransientTrack/plugins/TransientTrackBuilderESProducer.h"
|
14 |
|
|
#include "TrackingTools/TrajectoryState/interface/TrajectoryStateOnSurface.h"
|
15 |
|
|
#include "TrackingTools/GeomPropagators/interface/AnalyticalTrajectoryExtrapolatorToLine.h"
|
16 |
|
|
#include "TrackingTools/GeomPropagators/interface/AnalyticalImpactPointExtrapolator.h"
|
17 |
|
|
#include "DataFormats/GeometryCommonDetAlgo/interface/Measurement1D.h"
|
18 |
|
|
#include "TrackingTools/TransientTrack/interface/TransientTrack.h"
|
19 |
|
|
#include "RecoVertex/VertexPrimitives/interface/ConvertToFromReco.h"
|
20 |
bendavid |
1.3 |
#include "MagneticField/UniformEngine/src/UniformMagneticField.h"
|
21 |
|
|
|
22 |
bendavid |
1.1 |
|
23 |
|
|
using namespace std;
|
24 |
|
|
using namespace edm;
|
25 |
|
|
using namespace mithep;
|
26 |
|
|
|
27 |
|
|
//--------------------------------------------------------------------------------------------------
|
28 |
|
|
FillerConversionsDecay::FillerConversionsDecay(const ParameterSet &cfg, const char *name, bool active) :
|
29 |
|
|
BaseFiller(cfg,name,active),
|
30 |
|
|
edmName_(Conf().getUntrackedParameter<string>("edmName","conversions")),
|
31 |
|
|
mitName_(Conf().getUntrackedParameter<string>("mitName","Conversions")),
|
32 |
|
|
stableDataName_(mitName_ + "_StableDatas"),
|
33 |
|
|
stablePartMapNames_(Conf().exists("stablePartMaps") ?
|
34 |
|
|
Conf().getUntrackedParameter<vector<string> >("stablePartMaps") :
|
35 |
|
|
vector<string>()),
|
36 |
|
|
conversionMapName_(Conf().getUntrackedParameter<string>("conversionMapName",
|
37 |
|
|
Form("%sMapName",mitName_.c_str()))),
|
38 |
|
|
decays_(new mithep::DecayParticleArr(250)),
|
39 |
|
|
stableData_(new mithep::StableDataArr(500)),
|
40 |
|
|
conversionMap_(new mithep::ConversionDecayMap)
|
41 |
|
|
{
|
42 |
|
|
// Constructor.
|
43 |
|
|
}
|
44 |
|
|
|
45 |
|
|
//--------------------------------------------------------------------------------------------------
|
46 |
|
|
FillerConversionsDecay::~FillerConversionsDecay()
|
47 |
|
|
{
|
48 |
|
|
// Destructor.
|
49 |
|
|
|
50 |
|
|
delete decays_;
|
51 |
|
|
delete stableData_;
|
52 |
|
|
delete conversionMap_;
|
53 |
|
|
}
|
54 |
|
|
|
55 |
|
|
//--------------------------------------------------------------------------------------------------
|
56 |
|
|
void FillerConversionsDecay::BookDataBlock(TreeWriter &tws)
|
57 |
|
|
{
|
58 |
|
|
// Add conversions to tree. Publish and get our objects.
|
59 |
|
|
|
60 |
|
|
tws.AddBranch(mitName_, &decays_);
|
61 |
|
|
OS()->add<mithep::DecayParticleArr>(decays_,mitName_);
|
62 |
|
|
tws.AddBranch(stableDataName_, &stableData_);
|
63 |
|
|
OS()->add<mithep::StableDataArr>(stableData_,stableDataName_);
|
64 |
|
|
|
65 |
|
|
if (!convElectronMapName_.empty()) {
|
66 |
|
|
conversionMap_->SetBrName(mitName_);
|
67 |
|
|
OS()->add(conversionMap_,conversionMapName_);
|
68 |
|
|
}
|
69 |
|
|
|
70 |
|
|
for (std::vector<std::string>::const_iterator bmapName = stablePartMapNames_.begin();
|
71 |
|
|
bmapName!=stablePartMapNames_.end(); ++bmapName) {
|
72 |
|
|
if (!bmapName->empty()) {
|
73 |
|
|
const TrackPartMap *map = OS()->get<TrackPartMap>(*bmapName);
|
74 |
|
|
if (map) {
|
75 |
|
|
stablePartMaps_.push_back(map);
|
76 |
|
|
AddBranchDep(mitName_,map->GetBrName());
|
77 |
|
|
}
|
78 |
|
|
}
|
79 |
|
|
}
|
80 |
|
|
}
|
81 |
|
|
|
82 |
|
|
//--------------------------------------------------------------------------------------------------
|
83 |
|
|
void FillerConversionsDecay::FillDataBlock(const edm::Event &event,
|
84 |
|
|
const edm::EventSetup &setup)
|
85 |
|
|
{
|
86 |
|
|
// Fill conversions data structure and maps.
|
87 |
|
|
|
88 |
|
|
decays_->Delete();
|
89 |
|
|
stableData_->Delete();
|
90 |
|
|
conversionMap_->Reset();
|
91 |
|
|
|
92 |
bendavid |
1.2 |
//get beamspot
|
93 |
|
|
edm::Handle<reco::BeamSpot> bsHandle;
|
94 |
|
|
event.getByLabel("offlineBeamSpot", bsHandle);
|
95 |
|
|
const reco::BeamSpot &thebs = *bsHandle.product();
|
96 |
|
|
|
97 |
|
|
//transient track producer
|
98 |
|
|
edm::ESHandle<TransientTrackBuilder> hTransientTrackBuilder;
|
99 |
|
|
setup.get<TransientTrackRecord>().get("TransientTrackBuilder",hTransientTrackBuilder);
|
100 |
|
|
const TransientTrackBuilder *transientTrackBuilder = hTransientTrackBuilder.product();
|
101 |
|
|
|
102 |
bendavid |
1.1 |
Handle<reco::ConversionCollection> hConversionProduct;
|
103 |
|
|
GetProduct(edmName_, hConversionProduct, event);
|
104 |
|
|
|
105 |
|
|
conversionMap_->SetEdmProductId(hConversionProduct.id().id());
|
106 |
|
|
|
107 |
|
|
const reco::ConversionCollection inConversions = *(hConversionProduct.product());
|
108 |
|
|
|
109 |
bendavid |
1.3 |
|
110 |
bendavid |
1.1 |
for (reco::ConversionCollection::const_iterator inConversion = inConversions.begin();
|
111 |
|
|
inConversion != inConversions.end(); ++inConversion) {
|
112 |
|
|
|
113 |
|
|
mithep::DecayParticle *outConversion = decays_->Allocate();
|
114 |
|
|
new (outConversion) mithep::DecayParticle(22);
|
115 |
|
|
|
116 |
|
|
math::XYZTLorentzVectorD convP4 = inConversion->refittedPair4Momentum();
|
117 |
|
|
FourVector p4Fitted(convP4.px(),convP4.py(),convP4.pz(),convP4.energy());
|
118 |
|
|
|
119 |
|
|
outConversion->SetMom(p4Fitted);
|
120 |
|
|
|
121 |
|
|
const reco::Vertex &vtx = inConversion->conversionVertex();
|
122 |
|
|
ThreeVector vtxPos(vtx.x(),vtx.y(),vtx.z());
|
123 |
bendavid |
1.3 |
GlobalPoint vtxPoint(vtx.x(),vtx.y(),vtx.z());
|
124 |
bendavid |
1.1 |
|
125 |
|
|
double dlz = vtxPos.z()*TMath::Abs(p4Fitted.Pz())/p4Fitted.Pz();
|
126 |
|
|
ThreeVector momPerp(p4Fitted.Px(),p4Fitted.Py(),0);
|
127 |
|
|
ThreeVector posPerp(vtxPos.x(),vtxPos.y(),0);
|
128 |
|
|
double dl = momPerp.Dot(posPerp)/momPerp.R();
|
129 |
|
|
double dxy = momPerp.Cross(vtxPos).Z()/p4Fitted.Pt();
|
130 |
|
|
|
131 |
|
|
outConversion->SetLz(dlz);
|
132 |
|
|
outConversion->SetLxy(dl);
|
133 |
|
|
outConversion->SetDxy(dxy);
|
134 |
|
|
|
135 |
|
|
outConversion->SetChi2(vtx.chi2());
|
136 |
|
|
outConversion->SetNdof((Int_t)vtx.ndof());
|
137 |
|
|
|
138 |
|
|
outConversion->SetNSharedHits(inConversion->nSharedHits());
|
139 |
|
|
|
140 |
|
|
const std::vector<reco::TrackBaseRef> &trackRefs = inConversion->tracks();
|
141 |
|
|
const std::vector<reco::Track> &refittedTracks = vtx.refittedTracks();
|
142 |
|
|
const std::vector<uint8_t> &nHitsBeforeVtx = inConversion->nHitsBeforeVtx();
|
143 |
|
|
const std::vector<Measurement1DFloat> &dlClosestHitToVtx = inConversion->dlClosestHitToVtx();
|
144 |
|
|
|
145 |
|
|
//fill conversion quality mask
|
146 |
|
|
ConversionQuality &outQuality = outConversion->Quality();
|
147 |
|
|
for (uint i=0; i<16; ++i) {
|
148 |
|
|
outQuality.SetQuality(ConversionQuality::EQuality(i),inConversion->quality(reco::Conversion::ConversionQuality(i)));
|
149 |
|
|
}
|
150 |
|
|
|
151 |
|
|
//fill daughters
|
152 |
bendavid |
1.3 |
double zbeamlineerr = -99.;
|
153 |
bendavid |
1.1 |
if (stablePartMaps_.size() && trackRefs.size()==2 && refittedTracks.size()==2) {
|
154 |
|
|
for (uint i=0; i<trackRefs.size(); ++i) {
|
155 |
|
|
|
156 |
|
|
const reco::TrackBaseRef &trackRef = trackRefs.at(i);
|
157 |
|
|
const reco::Track &refittedTrack = refittedTracks.at(i);
|
158 |
|
|
|
159 |
bendavid |
1.3 |
//fill dzError at beamline (take from refitted first track normally)
|
160 |
|
|
if (zbeamlineerr<0.) {
|
161 |
|
|
const reco::TransientTrack &tt = transientTrackBuilder->build(refittedTrack);
|
162 |
|
|
//null b-field
|
163 |
|
|
const UniformMagneticField nullField(0.0);
|
164 |
|
|
TransverseImpactPointExtrapolator extrapolator(&nullField);
|
165 |
|
|
|
166 |
|
|
//const TrajectoryStateOnSurface &bsstate = extrapolator.extrapolate(tt.stateOnSurface(vtxPoint), RecoVertex::convertPos(thebs.position()));
|
167 |
|
|
const FreeTrajectoryState &initialfts = tt.initialFreeState();
|
168 |
|
|
const GlobalTrajectoryParameters trackgtp(initialfts.position(),initialfts.momentum(),initialfts.charge(),&nullField);
|
169 |
|
|
const FreeTrajectoryState trackfts(trackgtp,initialfts.cartesianError(),initialfts.curvilinearError());
|
170 |
|
|
const TrajectoryStateOnSurface &bsstate = extrapolator.extrapolate(trackfts, RecoVertex::convertPos(thebs.position()));
|
171 |
|
|
|
172 |
|
|
if (bsstate.isValid()) {
|
173 |
|
|
double zbeamline = bsstate.globalPosition().z();
|
174 |
|
|
zbeamlineerr = sqrt((bsstate.cartesianError().matrix())(2,2));
|
175 |
|
|
if (0) {
|
176 |
|
|
math::XYZVector mom = inConversion->refittedPairMomentum();
|
177 |
|
|
double zbeamlineconv = (vtx.z()) - ((vtx.x()-thebs.position().x())*mom.x()+(vtx.y()-thebs.position().y())*mom.y())/mom.rho() * mom.z()/mom.rho();
|
178 |
bendavid |
1.2 |
|
179 |
bendavid |
1.3 |
double zbeamlinetrk = (refittedTrack.vertex().z()) - ((refittedTrack.vertex().x()-thebs.position().x())*refittedTrack.momentum().x()+(refittedTrack.vertex().y()-thebs.position().y())*refittedTrack.momentum().y())/refittedTrack.momentum().rho() * refittedTrack.momentum().z()/refittedTrack.momentum().rho();
|
180 |
bendavid |
1.2 |
|
181 |
bendavid |
1.3 |
printf("zbeamlineconv = %5f, zbeamlinetrk = %5f, zbeamline = %5f, zbeamlineerr = %5f\n",zbeamlineconv,zbeamlinetrk,zbeamline,zbeamlineerr);
|
182 |
|
|
}
|
183 |
bendavid |
1.2 |
}
|
184 |
|
|
}
|
185 |
|
|
|
186 |
|
|
|
187 |
bendavid |
1.1 |
const mithep::Particle *daughter = GetMitParticle(mitedm::refToBaseToPtr(trackRef));
|
188 |
|
|
|
189 |
|
|
mithep::StableData *outStable = stableData_->Allocate();
|
190 |
|
|
new (outStable) mithep::StableData(daughter,
|
191 |
|
|
refittedTrack.px(),refittedTrack.py(),refittedTrack.pz());
|
192 |
|
|
|
193 |
|
|
if (nHitsBeforeVtx.size()>i) {
|
194 |
|
|
outStable->SetNHitsBeforeVtx(nHitsBeforeVtx.at(i));
|
195 |
|
|
}
|
196 |
|
|
if (dlClosestHitToVtx.size()>i) {
|
197 |
|
|
outStable->SetDlClosestHitToVtx(dlClosestHitToVtx.at(i).value());
|
198 |
|
|
outStable->SetDlClosestHitToVtxErr(dlClosestHitToVtx.at(i).error());
|
199 |
|
|
}
|
200 |
|
|
|
201 |
|
|
outConversion->AddDaughterData(outStable);
|
202 |
|
|
}
|
203 |
|
|
}
|
204 |
bendavid |
1.3 |
|
205 |
|
|
outConversion->SetDzBeamlineError(zbeamlineerr);
|
206 |
bendavid |
1.1 |
|
207 |
|
|
reco::ConversionRef theRef(hConversionProduct, inConversion-inConversions.begin());
|
208 |
|
|
conversionMap_->Add(theRef, outConversion);
|
209 |
|
|
}
|
210 |
|
|
|
211 |
|
|
decays_->Trim();
|
212 |
|
|
}
|
213 |
|
|
|
214 |
|
|
//--------------------------------------------------------------------------------------------------
|
215 |
|
|
mithep::Particle *FillerConversionsDecay::GetMitParticle(edm::Ptr<reco::Track> ptr) const
|
216 |
|
|
{
|
217 |
|
|
// Return our particle referenced by the edm pointer.
|
218 |
|
|
|
219 |
|
|
mithep::Particle *mitPart = 0;
|
220 |
|
|
for (std::vector<const mithep::TrackPartMap*>::const_iterator bmap = stablePartMaps_.begin();
|
221 |
|
|
bmap!=stablePartMaps_.end(); ++bmap) {
|
222 |
|
|
const mithep::TrackPartMap *theMap = *bmap;
|
223 |
|
|
if (theMap->HasMit(ptr)) {
|
224 |
|
|
mitPart = theMap->GetMit(ptr);
|
225 |
|
|
return mitPart;
|
226 |
|
|
}
|
227 |
|
|
}
|
228 |
|
|
|
229 |
|
|
if (!mitPart)
|
230 |
|
|
throw edm::Exception(edm::errors::Configuration, "FillerConversionsDecay::FillDataBlock()\n")
|
231 |
|
|
<< "Error! MITHEP Object "
|
232 |
|
|
<< "not found in AssociationMaps (" << typeid(*this).name() << ")." << std::endl;
|
233 |
|
|
|
234 |
|
|
return mitPart;
|
235 |
|
|
}
|