ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/MitProd/TreeFiller/src/FillerConversionsDecay.cc
Revision: 1.1
Committed: Mon Nov 22 16:53:31 2010 UTC (14 years, 5 months ago) by bendavid
Content type: text/plain
Branch: MAIN
CVS Tags: Mit_018, Mit_017, Mit_017pre3, Mit_017pre2, Mit_017pre1
Log Message:
New filler for conversions

File Contents

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