ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/MitProd/TreeFiller/src/FillerConversionsDecay.cc
Revision: 1.4
Committed: Sat Apr 23 19:13:14 2011 UTC (14 years ago) by bendavid
Content type: text/plain
Branch: MAIN
CVS Tags: Mit_026, Mit_025e, Mit_025d, Mit_025c, Mit_025b, Mit_025a, Mit_025, Mit_025pre2, Mit_024b, Mit_025pre1, Mit_024a, Mit_024, Mit_023, Mit_022a, Mit_022, Mit_021, Mit_021pre2, Mit_021pre1
Branch point for: Mit_025c_branch
Changes since 1.3: +3 -3 lines
Log Message:
minimal compilation fixes for 42x

File Contents

# Content
1 // $Id: FillerConversionsDecay.cc,v 1.3 2011/03/22 00:23:11 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 (!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 //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() && 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 //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
179 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
181 printf("zbeamlineconv = %5f, zbeamlinetrk = %5f, zbeamline = %5f, zbeamlineerr = %5f\n",zbeamlineconv,zbeamlinetrk,zbeamline,zbeamlineerr);
182 }
183 }
184 }
185
186
187 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
205 outConversion->SetDzBeamlineError(zbeamlineerr);
206
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 }