ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/MitProd/TreeFiller/src/FillerConversionsDecay.cc
Revision: 1.5
Committed: Sat May 5 16:49:59 2012 UTC (12 years, 11 months ago) by paus
Content type: text/plain
Branch: MAIN
CVS Tags: Mit_029, Mit_029_pre1, Mit_028a, Mit_028, Mit_027a, Mit_027
Changes since 1.4: +13 -7 lines
Log Message:
Version 027 - complete version for ICHEP 2012.

File Contents

# User Rev Content
1 paus 1.5 // $Id: FillerConversionsDecay.cc,v 1.4 2011/04/23 19:13:14 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 paus 1.5 if (!conversionMapName_.empty()) {
66 bendavid 1.1 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 bendavid 1.4 math::XYZTLorentzVectorD convP4(inConversion->refittedPair4Momentum());
117 bendavid 1.1 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 paus 1.5 if (stablePartMaps_.size()) {
154 bendavid 1.1 for (uint i=0; i<trackRefs.size(); ++i) {
155    
156     const reco::TrackBaseRef &trackRef = trackRefs.at(i);
157 paus 1.5
158     const reco::Track *refittedTrack = 0;
159    
160     if (refittedTracks.size()>i)
161     refittedTrack = &refittedTracks.at(i);
162     else
163     refittedTrack = trackRef.get();
164 bendavid 1.1
165 bendavid 1.3 //fill dzError at beamline (take from refitted first track normally)
166     if (zbeamlineerr<0.) {
167 paus 1.5 const reco::TransientTrack &tt = transientTrackBuilder->build(*refittedTrack);
168 bendavid 1.3 //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 bendavid 1.4 math::XYZVector mom(inConversion->refittedPairMomentum());
183 bendavid 1.3 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 bendavid 1.2
185 paus 1.5 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 bendavid 1.2
187 bendavid 1.3 printf("zbeamlineconv = %5f, zbeamlinetrk = %5f, zbeamline = %5f, zbeamlineerr = %5f\n",zbeamlineconv,zbeamlinetrk,zbeamline,zbeamlineerr);
188     }
189 bendavid 1.2 }
190     }
191    
192    
193 bendavid 1.1 const mithep::Particle *daughter = GetMitParticle(mitedm::refToBaseToPtr(trackRef));
194    
195     mithep::StableData *outStable = stableData_->Allocate();
196     new (outStable) mithep::StableData(daughter,
197 paus 1.5 refittedTrack->px(),refittedTrack->py(),refittedTrack->pz());
198 bendavid 1.1
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 bendavid 1.3
211     outConversion->SetDzBeamlineError(zbeamlineerr);
212 bendavid 1.1
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     }