ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/MitProd/TreeFiller/src/FillerConversionsDecay.cc
Revision: 1.3
Committed: Tue Mar 22 00:23:11 2011 UTC (14 years, 1 month ago) by bendavid
Content type: text/plain
Branch: MAIN
CVS Tags: Mit_020d, TMit_020d, Mit_020c, Mit_020b, Mit_020a, Mit_020
Changes since 1.2: +30 -11 lines
Log Message:
fix and protect conversion z error filling

File Contents

# User Rev Content
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     }