ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/MitProd/TreeFiller/src/FillerConversionsDecay.cc
Revision: 1.2
Committed: Sun Mar 13 22:15:01 2011 UTC (14 years, 1 month ago) by bendavid
Content type: text/plain
Branch: MAIN
CVS Tags: Mit_020pre1
Changes since 1.1: +36 -1 lines
Log Message:
fill z uncertainty at beamline

File Contents

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