ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/MitProd/TreeFiller/src/FillerConversionsDecay.cc
Revision: 1.4.2.1
Committed: Tue May 15 23:31:20 2012 UTC (12 years, 11 months ago) by paus
Content type: text/plain
Branch: Mit_025c_branch
CVS Tags: Mit_025c_branch1, Mit_025c_branch0
Changes since 1.4: +13 -7 lines
Log Message:
Backporting from 5x.

File Contents

# Content
1 // $Id: FillerConversionsDecay.cc,v 1.4 2011/04/23 19:13:14 bendavid Exp $
2
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 #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 #include "MagneticField/UniformEngine/src/UniformMagneticField.h"
21
22
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 (!conversionMapName_.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 //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 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
110 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 GlobalPoint vtxPoint(vtx.x(),vtx.y(),vtx.z());
124
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 double zbeamlineerr = -99.;
153 if (stablePartMaps_.size()) {
154 for (uint i=0; i<trackRefs.size(); ++i) {
155
156 const reco::TrackBaseRef &trackRef = trackRefs.at(i);
157
158 const reco::Track *refittedTrack = 0;
159
160 if (refittedTracks.size()>i)
161 refittedTrack = &refittedTracks.at(i);
162 else
163 refittedTrack = trackRef.get();
164
165 //fill dzError at beamline (take from refitted first track normally)
166 if (zbeamlineerr<0.) {
167 const reco::TransientTrack &tt = transientTrackBuilder->build(*refittedTrack);
168 //null b-field
169 const UniformMagneticField nullField(0.0);
170 TransverseImpactPointExtrapolator extrapolator(&nullField);
171
172 //const TrajectoryStateOnSurface &bsstate = extrapolator.extrapolate(tt.stateOnSurface(vtxPoint), RecoVertex::convertPos(thebs.position()));
173 const FreeTrajectoryState &initialfts = tt.initialFreeState();
174 const GlobalTrajectoryParameters trackgtp(initialfts.position(),initialfts.momentum(),initialfts.charge(),&nullField);
175 const FreeTrajectoryState trackfts(trackgtp,initialfts.cartesianError(),initialfts.curvilinearError());
176 const TrajectoryStateOnSurface &bsstate = extrapolator.extrapolate(trackfts, RecoVertex::convertPos(thebs.position()));
177
178 if (bsstate.isValid()) {
179 double zbeamline = bsstate.globalPosition().z();
180 zbeamlineerr = sqrt((bsstate.cartesianError().matrix())(2,2));
181 if (0) {
182 math::XYZVector mom(inConversion->refittedPairMomentum());
183 double zbeamlineconv = (vtx.z()) - ((vtx.x()-thebs.position().x())*mom.x()+(vtx.y()-thebs.position().y())*mom.y())/mom.rho() * mom.z()/mom.rho();
184
185 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();
186
187 printf("zbeamlineconv = %5f, zbeamlinetrk = %5f, zbeamline = %5f, zbeamlineerr = %5f\n",zbeamlineconv,zbeamlinetrk,zbeamline,zbeamlineerr);
188 }
189 }
190 }
191
192
193 const mithep::Particle *daughter = GetMitParticle(mitedm::refToBaseToPtr(trackRef));
194
195 mithep::StableData *outStable = stableData_->Allocate();
196 new (outStable) mithep::StableData(daughter,
197 refittedTrack->px(),refittedTrack->py(),refittedTrack->pz());
198
199 if (nHitsBeforeVtx.size()>i) {
200 outStable->SetNHitsBeforeVtx(nHitsBeforeVtx.at(i));
201 }
202 if (dlClosestHitToVtx.size()>i) {
203 outStable->SetDlClosestHitToVtx(dlClosestHitToVtx.at(i).value());
204 outStable->SetDlClosestHitToVtxErr(dlClosestHitToVtx.at(i).error());
205 }
206
207 outConversion->AddDaughterData(outStable);
208 }
209 }
210
211 outConversion->SetDzBeamlineError(zbeamlineerr);
212
213 reco::ConversionRef theRef(hConversionProduct, inConversion-inConversions.begin());
214 conversionMap_->Add(theRef, outConversion);
215 }
216
217 decays_->Trim();
218 }
219
220 //--------------------------------------------------------------------------------------------------
221 mithep::Particle *FillerConversionsDecay::GetMitParticle(edm::Ptr<reco::Track> ptr) const
222 {
223 // Return our particle referenced by the edm pointer.
224
225 mithep::Particle *mitPart = 0;
226 for (std::vector<const mithep::TrackPartMap*>::const_iterator bmap = stablePartMaps_.begin();
227 bmap!=stablePartMaps_.end(); ++bmap) {
228 const mithep::TrackPartMap *theMap = *bmap;
229 if (theMap->HasMit(ptr)) {
230 mitPart = theMap->GetMit(ptr);
231 return mitPart;
232 }
233 }
234
235 if (!mitPart)
236 throw edm::Exception(edm::errors::Configuration, "FillerConversionsDecay::FillDataBlock()\n")
237 << "Error! MITHEP Object "
238 << "not found in AssociationMaps (" << typeid(*this).name() << ")." << std::endl;
239
240 return mitPart;
241 }