ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/MitProd/TreeFiller/src/FillerConversionsDecay.cc
Revision: 1.7
Committed: Fri Dec 28 17:27:21 2012 UTC (12 years, 4 months ago) by pharris
Content type: text/plain
Branch: MAIN
CVS Tags: Mit_032, Mit_031, Mit_030, Mit_029c, Mit_029b, Mit_030_pre1, Mit_029a, HEAD
Changes since 1.6: +16 -13 lines
Error occurred while calculating annotation data.
Log Message:
Added Embedded and PFAOD functionality

File Contents

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