ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/MitConversions/Mods/src/MvfConversions.cc
Revision: 1.3
Committed: Mon Jan 12 10:26:47 2009 UTC (16 years, 3 months ago) by bendavid
Content type: text/plain
Branch: MAIN
Changes since 1.2: +12 -11 lines
Log Message:
Various changes

File Contents

# User Rev Content
1 bendavid 1.3 // $Id: MvfConversions.cc,v 1.2 2008/12/01 18:32:42 bendavid Exp $
2 bendavid 1.1 #include <TH1.h>
3     #include <TH1F.h>
4     #include <TH2F.h>
5     #include <TCanvas.h>
6    
7     #include "MitConversions/Mods/interface/MvfConversions.h"
8     #include "MitAna/DataTree/interface/Electron.h"
9     #include "MitAna/DataTree/interface/Track.h"
10     #include "MitAna/DataCont/interface/ObjArray.h"
11     #include "MitAna/DataTree/interface/Names.h"
12     #include "MitCommon/MathTools/interface/MathUtils.h"
13    
14     using namespace mithep;
15    
16     ClassImp(mithep::MvfConversions)
17    
18     //__________________________________________________________________________________________________
19     MvfConversions::MvfConversions(const char *name, const char *title) :
20 bendavid 1.3 BaseMod (name,title),
21 bendavid 1.1 fPtMin (0),
22     fEtaMax (0),
23     fProbMin (0),
24     fExcludePXB1(false),
25     fMassMax(0),
26     fMissedHitsMax(0),
27     fWrongHitsMax(0),
28     fElectronPtMin(0),
29     fElectronEtaMax(0),
30     fComputeEff(kFALSE),
31     fTracks (0),
32     fGsfTracks (0),
33     fInOutTracks (0),
34     fOutInTracks (0),
35     fElectrons (0),
36 bendavid 1.2 fTrkElectrons(0),
37 bendavid 1.1 fPhotons (0),
38     fMCParticles (0),
39     fMvfConversions (0),
40     fMvfConversionsUnconstrained (0),
41     fMCPartName (Names::gkMCPartBrn),
42     fTrackName (Names::gkTrackBrn),
43     fConvElectronName ("Electrons"),
44     fPhotonName (Names::gkPhotonBrn),
45     fMvfConvName("MvfConversions"),
46     fMvfConvUnconstrainedName("MvfConversionsUnconstrained"),
47     fElectronName(Names::gkElectronBrn),
48 bendavid 1.2 fTrkElectronName("TrackerElectrons"),
49     fGoodElectronsName("ConversionElectrons"),
50     fGoodTwoClusterElectronsName("TwoClusterConversionElectrons"),
51     fBadElectronsName("ConversionRemovedElectrons"),
52 bendavid 1.1 hConversionRadius (0),
53     hConversionZ(0),
54     hConversionRPhi (0),
55     hConversionRZ(0),
56     hGammaPt (0),
57     hGammaEta (0),
58     hGammaMass (0),
59     hSimMatchedGammaMass(0),
60     hConvProb (0),
61     hConvChi2 (0),
62     hSimMatchedConvChi2(0),
63     hConvDCotTheta (0),
64     hConvDCotThetaPreCut (0),
65     hConvEOverP (0),
66     hElectronPt (0),
67     hMinElectronPt (0),
68     hSimMinElectronPt (0),
69     hSimMatchedMinElectronPt (0),
70     hSimMatchedMinElectronSimPt (0),
71     hElectronEta (0),
72     hEPairMass (0),
73     hEPairDeltaPhi (0),
74     hGenNumDaughters (0),
75     hGenDaughterPt (0),
76     hGenDecayRadius (0),
77     hSimPt (0),
78     hSimConvRadius (0),
79     hSimConvPosition(0),
80     hTrackSimMatchType (0),
81     hParentSimMatchType (0),
82     hSimMatchedConvRadius (0),
83     hSimMatchedConvProb (0),
84     hSimMatchedEPairMass (0),
85     hSimMatchedEPairDeltaPhi (0),
86     hSimMatchedSimConvRadius (0),
87     hSimMatchedConvResolution (0),
88     hSimMatchedConvPhiRes (0),
89     hSimMatchedConvEOverP (0),
90     hSimMatchedElectronPt (0),
91     hSimMatchedGammaPt (0),
92     hSimMatchedGammaEta (0),
93     hSimMatchedSimGammaPt (0),
94     hSimMatchedSimGammaEta (0),
95     hTrackChi2 (0),
96     hTrackProb (0),
97     hTrackNHits (0),
98     hTrackNHitsProb (0),
99     hTrackD0 (0),
100     hUnMatchedTrackChi2 (0),
101     hUnMatchedTrackProb (0),
102     hUnMatchedTrackNHits (0),
103     hUnMatchedTrackNHitsProb (0),
104     hUnMatchedTrackD0 (0),
105     hSimMatchedTrackChi2 (0),
106     hSimMatchedTrackProb (0),
107     hSimMatchedTrackNHits (0),
108     hSimMatchedTrackNHitsProb (0),
109     hSimMatchedTrackD0 (0),
110     hLxy(0),
111     hLxyOverLxyErr(0),
112     hLz(0),
113     hLzOverLzErr(0),
114     hDxy(0),
115     hSimMatchedLxy(0),
116     hSimMatchedLz(0),
117     hSimMatchedDxy(0),
118     hNTracks(0),
119     hSimMatchedNTracks(0),
120     hIsolation(0),
121     hSimMatchedIsolation(0),
122     hNConversions(0),
123     hDoubleConvMass(0),
124     hConvGammaMass(0),
125     hPiPiMass(0)
126     {
127     // Constructor.
128     }
129    
130     //__________________________________________________________________________________________________
131     void MvfConversions::Begin()
132     {
133     // Run startup code on the client machine. For this module, we dont do anything here.
134     }
135    
136     //__________________________________________________________________________________________________
137     void MvfConversions::SlaveBegin()
138     {
139     // Run startup code on the computer (slave) doing the actual analysis. Here, we typically
140     // initialize histograms and other analysis objects and request branches. For this module, we
141     // request a branch of the MitTree.
142    
143     // Request the branches
144     ReqBranch(fTrackName, fTracks);
145     ReqBranch("ConversionInOutTracks", fInOutTracks);
146     ReqBranch("ConversionOutInTracks", fOutInTracks);
147     ReqBranch(fElectronName, fElectrons);
148 bendavid 1.2 ReqBranch(fTrkElectronName, fTrkElectrons);
149 bendavid 1.1 ReqBranch(fPhotonName, fPhotons);
150     ReqBranch(fMCPartName, fMCParticles);
151     ReqBranch(fMvfConvName, fMvfConversions);
152     ReqBranch(fMvfConvUnconstrainedName, fMvfConversionsUnconstrained);
153    
154     // Book our histograms
155    
156     hConversionRPhi = new TH2F("Photon Conversion Position R-Phi","Conversion Position R-Phi (cm)", 100, -100.0,100.0,100,-100.0,100.0);
157     AddOutput(hConversionRPhi);
158    
159     hConversionRZ = new TH2F("Photon Conversion Position R-Z","Conversion Position R-Z (cm)", 1000, -100.0,100.0,1000,-100.0,100.0);
160     AddOutput(hConversionRZ);
161    
162     hSimConvPosition = new TH2F("Sim Photon Conversion Position","Sim Photon Conversion Position", 200, -200.0,200.0,200,-200.0,200.0);
163     AddOutput(hSimConvPosition);
164    
165    
166     //TH1::SetDefaultSumw2(kTRUE);
167    
168     hConversionRadius = new TH1F("Photon Conversion Radius","Radius (cm)",800,0,200.0);
169     AddOutput(hConversionRadius);
170    
171     hConversionZ = new TH1F("Photon Conversion Z position", "Conversion Z position (cm)", 200, -200.0, 200.0);
172     AddOutput(hConversionZ);
173    
174     hGammaPt = new TH1F("Photon Pt","Photon Pt (GeV)",400,0,200.0);
175     AddOutput(hGammaPt);
176    
177     hGammaEta = new TH1F("Photon Eta","Photon Eta",200,-5.0,5.0);
178     AddOutput(hGammaEta);
179    
180     hGammaMass = new TH1F("Photon Invariant Mass","Photon Invariant Mass",200,0,20.0);
181     AddOutput(hGammaMass);
182    
183     hSimMatchedGammaMass = new TH1F("SimMatched Photon Invariant Mass","SimMatched Photon Invariant Mass",200,0,20.0);
184     AddOutput(hSimMatchedGammaMass);
185    
186     hConvProb = new TH1F("Conversion Vertex fit probability", "Vertex Fit Probability",200,0.0,1.0);
187     AddOutput(hConvProb);
188    
189     hConvChi2 = new TH1F("Conversion Vertex fit Chi squared", "Vertex Fit Chi Squared",2000,0.0,100.0);
190     AddOutput(hConvChi2);
191    
192     hSimMatchedConvChi2 = new TH1F("Sim Matched Conversion Vertex fit Chi squared", "Sim Matched Vertex Fit Chi Squared",2000,0.0,100.0);
193     AddOutput(hSimMatchedConvChi2);
194    
195     hConvDCotTheta = new TH1F("Conversion DCotTheta", "DCotTheta",10001,-10.0,10.0);
196     AddOutput(hConvDCotTheta);
197    
198     hConvDCotThetaPreCut = new TH1F("Conversion DCotTheta before fit prob cut", "DCotThetaPreCut",1000,-10.0,10.0);
199     AddOutput(hConvDCotThetaPreCut);
200    
201     hConvEOverP = new TH1F("Conversion E over P", "Conversion E over P",200,0.0,50.0);
202     AddOutput(hConvEOverP);
203    
204     hElectronPt = new TH1F("Electron Pt","Electron Pt (GeV)",400,0,200.0);
205     AddOutput(hElectronPt);
206    
207     hMinElectronPt = new TH1F("Min Electron Pt","Min Electron Pt (GeV)",400,0,200.0);
208     AddOutput(hMinElectronPt);
209    
210     hSimMatchedMinElectronPt = new TH1F("Sim Matched Min Electron Pt","Sim Matched Min Electron Pt (GeV)",400,0,200.0);
211     AddOutput(hSimMatchedMinElectronPt);
212    
213     hSimMatchedMinElectronSimPt = new TH1F("Sim Matched Min Electron Sim Pt","Sim Matched Min Electron Sim Pt (GeV)",400,0,200.0);
214     AddOutput(hSimMatchedMinElectronSimPt);
215    
216     hSimMinElectronPt = new TH1F("Sim Min Electron Pt","Sim Min Electron Pt (GeV)",400,0,200.0);
217     AddOutput(hSimMinElectronPt);
218    
219     hElectronEta = new TH1F("Electron Eta","Electron Eta",200,-5.0,5.0);
220     AddOutput(hElectronEta);
221    
222     hEPairMass = new TH1F("Electron Pair Invariant Mass","Electron Pair Invariant Mass",200,0.0,10);
223     AddOutput(hEPairMass);
224    
225     hEPairDeltaPhi = new TH1F("Electron Pair Delta Phi","Electron Pair Delta Phi",200,-4.0,4.0);
226     AddOutput(hEPairDeltaPhi);
227    
228     hGenNumDaughters = new TH1F("Number of Decay daughters - gen level","Number of Decay daughters - gen level",10,-0.5,9.5);
229     AddOutput(hGenNumDaughters);
230    
231     hGenDaughterPt = new TH1F("Pt of decay daugthers - gen level","Pt of decay daugthers - gen level",400,0,200.0);
232     AddOutput(hGenDaughterPt);
233    
234     hGenDecayRadius = new TH1F("Decay vertex radius - gen level","Decay vertex radius - gen level",800,0,200.0);
235     AddOutput(hGenDecayRadius);
236    
237     hSimPt = new TH1F("Pt - sim level","Pt - sim level",400,0,200.0);
238     AddOutput(hSimPt);
239    
240     hSimConvRadius = new TH1F("Sim Photon Conversion Radius","Sim Photon Conversion Radius",800,0,200.0);
241     AddOutput(hSimConvRadius);
242    
243     // hTrackD0 = new TH1F("general track D0","general track D0",400,0,200.0);
244     // AddOutput(hTrackD0);
245    
246     hTrackSimMatchType = new TH1F("Conversion Electron matched sim pdg","Conversion Electron matched sim pdg",10001,-5000.5,5000.5);
247     AddOutput(hTrackSimMatchType);
248    
249     hParentSimMatchType = new TH1F("Conversion Parent matched sim pdg","Conversion Parent matched sim pdg",10001,-5000.5,5000.5);
250     AddOutput(hParentSimMatchType);
251    
252     hSimMatchedConvRadius = new TH1F("Sim Matched Photon Conversion Radius","Sim Matched Photon Conversion Radius",800,0,200.0);
253     AddOutput(hSimMatchedConvRadius);
254    
255     hSimMatchedConvProb = new TH1F("Sim Matched Conversion Vertex fit probability", "Sim Matched Vertex Fit Probability",200,0.0,1.0);
256     AddOutput(hSimMatchedConvProb);
257    
258     hSimMatchedEPairMass = new TH1F("Sim Matched Electron Pair Invariant Mass","Sim Matched Electron Pair Invariant Mass",200,0.0,10);
259     AddOutput(hSimMatchedEPairMass);
260    
261     hSimMatchedEPairDeltaPhi = new TH1F("Sim Matched Electron Pair Delta Phi","Sim Matched Electron Pair Delta Phi",200,-4.0,4.0);
262     AddOutput(hSimMatchedEPairDeltaPhi);
263    
264     hSimMatchedSimConvRadius = new TH1F("Sim Matched Photon Sim Conversion Radius","Sim Matched Photon Conversion Sim Radius",800,0,200.0);
265     AddOutput(hSimMatchedSimConvRadius);
266    
267     hSimMatchedConvResolution = new TH1F("Sim Matched Photon Conversion Radius Resolution","Sim Matched Photon Conversion Radius Resolution",300,-30.0,30.0);
268     AddOutput(hSimMatchedConvResolution);
269    
270     hSimMatchedConvPhiRes = new TH1F("Sim Matched Photon Conversion Phi Resolution","Sim Matched Photon Conversion Phi Resolution",1000,-3.5,3.5);
271     AddOutput(hSimMatchedConvPhiRes);
272    
273     hSimMatchedConvEOverP = new TH1F("Sim Matched Conversion E over P", "Sim Matched Conversion E over P",200,0.0,50.0);
274     AddOutput(hSimMatchedConvEOverP);
275    
276     hSimMatchedElectronPt = new TH1F("Sim Matched Electron Pt","Sim Matched Electron Pt (GeV)",400,0,200.0);
277     AddOutput(hSimMatchedElectronPt);
278    
279     hSimMatchedGammaPt = new TH1F("Sim Matched Photon Pt","Sim Matched Photon Pt (GeV)",400,0,200.0);
280     AddOutput(hSimMatchedGammaPt);
281    
282     hSimMatchedGammaEta = new TH1F("Sim Matched Photon Eta","Sim Matched Photon Eta",200,-5.0,5.0);
283     AddOutput(hSimMatchedGammaEta);
284    
285     hSimMatchedSimGammaPt = new TH1F("Sim Matched Sim Photon Pt","Sim Matched Sim Photon Pt (GeV)",400,0,200.0);
286     AddOutput(hSimMatchedSimGammaPt);
287    
288     hSimMatchedSimGammaEta = new TH1F("Sim Matched Sim Photon Eta","Sim Matched Sim Photon Eta",200,-5.0,5.0);
289     AddOutput(hSimMatchedSimGammaEta);
290    
291     hTrackChi2 = new TH1F("Conversion Track RChi squared", "Track RChi Squared",200,0.0,10.0);
292     AddOutput(hTrackChi2);
293    
294     hTrackProb = new TH1F("Conversion Track fit probability", "Track Fit Probability",200,0.0,1.0);
295     AddOutput(hTrackProb);
296    
297     hTrackNHits = new TH1F("Conversion Track NHits", "Track NHits",37,-0.5,36.5);
298     AddOutput(hTrackNHits);
299    
300     hTrackNHitsProb = new TH2F("Track NHits-RChi2","Track NHits-RChi2", 37,-0.5,36.5,50,0.0,10.0);
301     AddOutput(hTrackNHitsProb);
302    
303     hTrackD0 = new TH1F("Conversion track D0","Conversion track D0",100,-5.0,5.0);
304     AddOutput(hTrackD0);
305    
306     hUnMatchedTrackChi2 = new TH1F("UnMatched Conversion Track RChi squared", "UnMatched Track RChi Squared",200,0.0,10.0);
307     AddOutput(hUnMatchedTrackChi2);
308    
309     hUnMatchedTrackProb = new TH1F("UnMatched Conversion Track fit probability", "UnMatched Track Fit Probability",200,0.0,1.0);
310     AddOutput(hUnMatchedTrackProb);
311    
312     hUnMatchedTrackNHits = new TH1F("UnMatched Conversion Track NHits", "UnMatched Track NHits",37,-0.5,36.5);
313     AddOutput(hUnMatchedTrackNHits);
314    
315     hUnMatchedTrackNHitsProb = new TH2F("UnMatched Track NHits-RChi2","UnMatched Track NHits-RChi2", 37,-0.5,36.5,50,0.0,10.0);
316     AddOutput(hUnMatchedTrackNHitsProb);
317    
318     hUnMatchedTrackD0 = new TH1F("UnMatched Conversion track D0","UnMatched Conversion track D0",100,-5.0,5.0);
319     AddOutput(hUnMatchedTrackD0);
320    
321     hSimMatchedTrackChi2 = new TH1F("SimMatched Conversion Track RChi squared", "SimMatched Track RChi Squared",200,0.0,10.0);
322     AddOutput(hSimMatchedTrackChi2);
323    
324     hSimMatchedTrackProb = new TH1F("SimMatched Conversion Track fit probability", "SimMatched Track Fit Probability",200,0.0,1.0);
325     AddOutput(hSimMatchedTrackProb);
326    
327     hSimMatchedTrackNHits = new TH1F("SimMatched Conversion Track NHits", "SimMatched Track NHits",37,-0.5,36.5);
328     AddOutput(hSimMatchedTrackNHits);
329    
330     hSimMatchedTrackNHitsProb = new TH2F("SimMatched Track NHits-RChi2","SimMatched Track NHits-RChi2", 37,-0.5,36.5,50,0.0,10.0);
331     AddOutput(hSimMatchedTrackNHitsProb);
332    
333     hSimMatchedTrackD0 = new TH1F("SimMatched Conversion track D0","SimMatched Conversion track D0",100,-5.0,5.0);
334     AddOutput(hSimMatchedTrackD0);
335    
336     hLxy = new TH1F("Conversion Lxy","Conversion Lxy",240,-30.0,30.0);
337     AddOutput(hLxy);
338    
339     hLxyOverLxyErr = new TH1F("Conversion Lxy/LxyErr","Conversion Lxy/LxyErr",200,-100.0,100.0);
340     AddOutput(hLxyOverLxyErr);
341    
342     hLz = new TH1F("Conversion Lz","Conversion Lz",200,-50.0,50.0);
343     AddOutput(hLz);
344    
345     hLzOverLzErr = new TH1F("Conversion Lz/LzErr","Conversion Lz/LzErr",200,-100.0,100.0);
346     AddOutput(hLzOverLzErr);
347    
348     hDxy = new TH1F("Conversion Dxy","Conversion Dxy",200,-5.0,5.0);
349     AddOutput(hDxy);
350    
351     hSimMatchedLxy = new TH1F("SimMatched Conversion Lxy","SimMatched Conversion Lxy",100,-30.0,30.0);
352     AddOutput(hSimMatchedLxy);
353    
354     hSimMatchedLz = new TH1F("SimMatched Conversion Lz","SimMatched Conversion Lz",200,-50.0,50.0);
355     AddOutput(hSimMatchedLz);
356    
357     hSimMatchedDxy = new TH1F("SimMatched Conversion Dxy","SimMatched Conversion Dxy",200,-5.0,5.0);
358     AddOutput(hSimMatchedDxy);
359    
360     hNTracks = new TH1F("Number of Tracks in the event", "Number of tracks in the event", 401, -0.5,400.5);
361     AddOutput(hNTracks);
362    
363     hSimMatchedNTracks = new TH1F("SimMatched Number of Tracks in the event", "SimMatched Number of tracks in the event", 401, -0.5,400.5);
364     AddOutput(hSimMatchedNTracks);
365    
366     hIsolation = new TH1F("Track Isolation of Conversion", "Track Isolation of Conversion", 201, -0.5,200.5);
367     AddOutput(hIsolation);
368    
369     hSimMatchedIsolation = new TH1F("SimMatched Track Isolation of Conversion", "SimMatched Track Isolation of Conversion", 201, -0.5,200.5);
370     AddOutput(hSimMatchedIsolation);
371    
372     hNConversions = new TH1F("Number of Conversions", "Number of Conversions",10,-0.5,10.5);
373     AddOutput(hNConversions);
374    
375     hDoubleConvMass = new TH1F("Double Conversion Mass", "Double Conversion Mass", 1000, 0.0, 10.0);
376     AddOutput(hDoubleConvMass);
377    
378     hConvGammaMass = new TH1F("Conversion plus Photon Mass", "Conversion plus Photon Mass", 1000, 0.0, 10.0);
379     AddOutput(hConvGammaMass);
380    
381     hPiPiMass = new TH1F("Conversion two pion Mass", "Conversion two pion Mass", 1000,0.0,10.0);
382     AddOutput(hPiPiMass);
383    
384     fTimer.Start(1e8);
385    
386     }
387    
388     //__________________________________________________________________________________________________
389     void MvfConversions::Process()
390     {
391     // Process entries of the tree. For this module, we just load the branch and fill the histograms.
392     // --> Why is this done on the basis of the name? should be the pointer!
393    
394     // BitMask64 testMask;
395     // testMask.SetBit(Track::TIB1S);
396     // testMask.SetBit(Track::TIB2S);
397     // testMask.SetBit(Track::TID1S);
398     // testMask.SetBit(Track::TID2S);
399     // testMask.SetBit(Track::TID3S);
400     // testMask.SetBit(Track::TOB1S);
401     // testMask.SetBit(Track::TOB2S);
402     // testMask.SetBit(Track::TEC1S);
403     // testMask.SetBit(Track::TEC2S);
404     // testMask.SetBit(Track::TEC3S);
405     // testMask.SetBit(Track::TEC4S);
406     // testMask.SetBit(Track::TEC5S);
407     // testMask.SetBit(Track::TEC6S);
408     // testMask.SetBit(Track::TEC7S);
409     // testMask.SetBit(Track::TEC8S);
410     // testMask.SetBit(Track::TEC9S);
411     //
412     // const Long64_t *maskVal = reinterpret_cast<const Long64_t*>(testMask.Bits());
413     //
414     // printf("HitMaskVal = %lli\n",*maskVal);
415     //
416     // Track testTrack;
417     // if (testMask == testTrack.StereoLayers())
418     // printf("stereo mask match\n");
419     // else
420     // printf("stereo mask mismatch\n");
421     //
422    
423     if (fComputeEff) {
424     LoadBranch(fMCPartName);
425     for (UInt_t i=0; i<fMCParticles->GetEntries(); ++i) {
426 bendavid 1.3 const MCParticle* p = fMCParticles->At(i);
427 bendavid 1.2 const BitMask16 simFailed = FailedSimCuts(p);
428    
429     BitMask16 simPtFailed = simFailed;
430     simPtFailed.ClearBit(eSimPt);
431     if (!simPtFailed.NBitsSet())
432     hSimPt->Fill(p->Pt());
433    
434     BitMask16 simRhoFailed = simFailed;
435     simRhoFailed.ClearBit(eSimRho);
436     if ( !simRhoFailed.NBitsSet() ) {
437     hSimConvRadius->Fill(p->DecayVertex().Rho());
438     hSimConvPosition->Fill(p->DecayVertex().X(),p->DecayVertex().Y());
439     }
440     Double_t minPt=999;
441     for (UInt_t j=0; j<p->NDaughters(); ++j) {
442     const MCParticle *d = p->Daughter(j);
443     if (TMath::Abs(d->PdgId())==11) {
444     if (d->Pt()<minPt)
445     minPt = d->Pt();
446 bendavid 1.1 }
447     }
448 bendavid 1.2
449     BitMask16 simElectronPtFailed = simFailed;
450     simElectronPtFailed.ClearBit(eSimElectronPt);
451     if ( !simElectronPtFailed.NBitsSet() )
452     hSimMinElectronPt->Fill(minPt);
453    
454 bendavid 1.1 }
455     }
456    
457     // Track* trackTest = new Track();
458     // Electron* electronTest = new Electron();
459     // electronTest->SetTrackerTrk(trackTest);
460     //
461     // Track *trackCopy = new Track(*trackTest);
462     // Electron* electronCopy = new Electron(*electronTest);
463     //
464     // const Track *electronTrack = electronTest->TrackerTrk();
465     // const Track *electronCopyTrack = electronCopy->TrackerTrk();
466     //
467     // Electron *secondElectron = new Electron();
468     // secondElectron->SetTrackerTrk(trackCopy);
469     //
470     // const Track *secondElectronTrack = secondElectron->TrackerTrk();
471     //
472     // if (electronTrack==trackTest)
473     // printf ("electronTrack==trackTest\n");
474     //
475     // if (electronTrack==trackCopy)
476     // printf("electronTrack==trackCopy\n");
477     //
478     // if (electronCopyTrack==trackTest)
479     // printf("electronCopyTrack==trackTest\n");
480     //
481     //
482     // if (electronCopyTrack==trackCopy)
483     // printf("electronCopyTrack==trackCopy\n");
484     //
485     // if (secondElectronTrack==trackTest)
486     // printf("secondElectronTrack==trackTest\n");
487     //
488     // if (secondElectronTrack==trackCopy)
489     // printf("secondElectronTrack==trackCopy\n");
490    
491     LoadBranch(fMvfConvName);
492     ObjArray<DecayParticle> goodConversions;
493 bendavid 1.2 ObjArray<Electron> *goodElectrons = new ObjArray<Electron>;
494     ObjArray<Electron> *goodTwoClusterElectrons = new ObjArray<Electron>;
495     ObjArray<Electron> *badElectrons = new ObjArray<Electron>;
496 bendavid 1.1 UInt_t nConversions = 0;
497     for (UInt_t i=0; i<fMvfConversions->GetEntries(); ++i) {
498 bendavid 1.3 const DecayParticle* c = fMvfConversions->At(i);
499 bendavid 1.2 const BitMask16 failed = FailedCuts(c);
500    
501     const MCParticle *simPhoton = SimMatch(c);
502     UInt_t nSimFailed=0;
503     BitMask16 simFailed;
504     if (simPhoton)
505     simFailed = FailedSimCuts(simPhoton);
506    
507 bendavid 1.1
508     //make N-2 plots for decay length
509 bendavid 1.2 BitMask16 decayLengthFailed = failed;
510     decayLengthFailed.ClearBit(eRho);
511     decayLengthFailed.ClearBit(eL);
512     if (!decayLengthFailed.NBitsSet()) {
513     hLxy->Fill(c->Lxy());
514     hLxyOverLxyErr->Fill(c->Lxy()/c->LxyError());
515     hLzOverLzErr->Fill(c->Lz()/c->LzError());
516     hLz->Fill(c->Lz());
517     if (simPhoton && !simFailed.NBitsSet() ) {
518     hSimMatchedLxy->Fill(c->Lxy());
519     hSimMatchedLz->Fill(c->Lz());
520 bendavid 1.1 }
521     }
522    
523     //make N-1 plots
524 bendavid 1.2
525     BitMask16 ptFailed = failed;
526     ptFailed.ClearBit(ePt);
527     if (!ptFailed.NBitsSet()) {
528     hGammaPt->Fill(c->Pt());
529     if (simPhoton) {
530     BitMask16 simPtFailed = simFailed;
531     simPtFailed.ClearBit(eSimPt);
532     if (!simPtFailed.NBitsSet()) {
533     hSimMatchedGammaPt->Fill(c->Pt());
534     hSimMatchedSimGammaPt->Fill(simPhoton->Pt());
535     }
536     }
537     }
538 bendavid 1.1
539 bendavid 1.2 BitMask16 etaFailed = failed;
540     etaFailed.ClearBit(eEta);
541     if (!etaFailed.NBitsSet()) {
542     hGammaEta->Fill(c->Eta());
543     if (simPhoton) {
544     BitMask16 simEtaFailed = simFailed;
545     simEtaFailed.ClearBit(eSimEta);
546     if (!simEtaFailed.NBitsSet()) {
547     hSimMatchedGammaEta->Fill(c->Eta());
548     hSimMatchedSimGammaEta->Fill(simPhoton->Eta());
549     }
550 bendavid 1.1 }
551 bendavid 1.2 }
552    
553     BitMask16 rhoFailed = failed;
554     rhoFailed.ClearBit(eRho);
555     if ( !rhoFailed.NBitsSet() ) {
556     hConversionRadius->Fill(c->Position().Rho());
557     hConversionRPhi->Fill(c->Position().X(), c->Position().Y());
558     hConversionRZ->Fill(c->Position().Z(), c->Position().Rho()*c->Position().Y()/TMath::Abs(c->Position().Y()));
559     if (simPhoton) {
560     BitMask16 simRhoFailed = simFailed;
561     simRhoFailed.ClearBit(eSimRho);
562     if ( !simRhoFailed.NBitsSet() ) {
563     hSimMatchedConvRadius->Fill(c->Position().Rho());
564     hSimMatchedSimConvRadius->Fill(simPhoton->DecayVertex().Rho());
565     }
566     }
567     }
568    
569     BitMask16 dxyFailed = failed;
570     dxyFailed.ClearBit(eDxy);
571     if ( !dxyFailed.NBitsSet() ) {
572     hDxy->Fill(c->Dxy());
573     if (simPhoton && !simFailed.NBitsSet() )
574     hSimMatchedDxy->Fill(c->Dxy());
575     }
576    
577     BitMask16 probFailed = failed;
578     probFailed.ClearBit(eProb);
579     if (!probFailed.NBitsSet()) {
580     hConvProb->Fill(c->Prob());
581     hConvChi2->Fill(c->Chi2());
582     if (simPhoton && !simFailed.NBitsSet() )
583     hSimMatchedConvProb->Fill(c->Prob());
584     }
585    
586     BitMask16 daughtersFailed = failed;
587     daughtersFailed.ClearBit(eDaughters);
588     if ( !daughtersFailed.NBitsSet() ) {
589     Double_t minElectronPt = c->Daughter(0)->Pt();
590     const Particle *minPtElectron = c->Daughter(0);
591     BitMask16 minPtElectronFailed;
592     for (UInt_t j=0; j<c->NDaughters(); ++j) {
593     const DaughterData* d = c->DaughterDat(j);
594     const ChargedParticle* dc = dynamic_cast<const ChargedParticle*>(c->Daughter(j));
595     if (!dc)
596     Fatal("FailedElectronCuts", "Daughter not a ChargedParticle");
597    
598     const Track* t = dc->Trk();
599    
600     const BitMask16 electronFailed = FailedElectronCuts(d);
601    
602     if (d->Pt() < minElectronPt) {
603     minElectronPt = d->Pt();
604     minPtElectron = dc;
605     minPtElectronFailed = electronFailed;
606     }
607    
608     BitMask16 failedEPt = electronFailed;
609     failedEPt.ClearBit(eEPt);
610     if (!failedEPt.NBitsSet())
611     hElectronPt->Fill(d->Pt());
612    
613     BitMask16 failedEEta = electronFailed;
614     failedEEta.ClearBit(eEEta);
615     if (!failedEEta.NBitsSet())
616     hElectronEta->Fill(d->Eta());
617    
618     BitMask16 failedENHits = electronFailed;
619     failedENHits.ClearBit(eENHits);
620     if (!failedENHits.NBitsSet()) {
621     hTrackNHits->Fill(t->NHits());
622     if (simPhoton && !simFailed.NBitsSet() )
623     hSimMatchedTrackNHits->Fill(t->NHits());
624     }
625    
626     BitMask16 failedEProb = electronFailed;
627     failedEProb.ClearBit(eEProb);
628     if (!failedEProb.NBitsSet()) {
629     hTrackProb->Fill(t->Prob());
630     if (simPhoton && !simFailed.NBitsSet() ) {
631     hSimMatchedTrackChi2->Fill(t->Chi2()/((Double_t)t->Ndof()));
632     hSimMatchedTrackProb->Fill(t->Prob());
633 bendavid 1.1 }
634 bendavid 1.2 }
635    
636     BitMask16 failedEProbNHits = electronFailed;
637     failedEProbNHits.ClearBit(eEProb);
638     failedEProbNHits.ClearBit(eENHits);
639     if ( !failedEProbNHits.NBitsSet() ) {
640     hTrackNHitsProb->Fill(t->NHits(),t->RChi2());
641     hTrackChi2->Fill(t->Chi2()/((Double_t)t->Ndof()));
642     if (simPhoton && !simFailed.NBitsSet() )
643     hSimMatchedTrackNHitsProb->Fill(t->NHits(),t->RChi2());
644     }
645    
646     if ( !electronFailed.NBitsSet()) {
647     hTrackD0->Fill(t->D0());
648     }
649 bendavid 1.1 }
650 bendavid 1.2
651     minPtElectronFailed.ClearBit(eEPt);
652     if (!minPtElectronFailed.NBitsSet()) {
653     hMinElectronPt->Fill(minElectronPt);
654     if (simPhoton) {
655     BitMask16 simMinPtElectronFailed = simFailed;
656     simMinPtElectronFailed.ClearBit(eSimElectronPt);
657     if (!simMinPtElectronFailed.NBitsSet()) {
658     if (!minPtElectron)
659     printf("no minptelectron");
660     const ChargedParticle* minElectronC = dynamic_cast<const ChargedParticle*>(minPtElectron);
661     if (!minElectronC)
662     printf("no minelectronC\n");
663     const Track *t = minElectronC->Trk();
664     if (!t)
665     printf("no t\n");
666     hSimMatchedMinElectronSimPt->Fill(t->MCPart()->Pt());
667     hSimMatchedMinElectronPt->Fill(minElectronPt);
668 bendavid 1.1 }
669 bendavid 1.2 }
670 bendavid 1.1 }
671 bendavid 1.2 }
672    
673     if ( !failed.NBitsSet() ) {
674     goodConversions.Add(c);
675     ++nConversions;
676     //fill photon histograms
677     hConversionZ->Fill(c->Position().Z());
678     hConvDCotTheta->Fill(DCotTheta(c));
679     hGammaMass->Fill(c->Mass());
680    
681     LoadBranch(fTrkElectronName);
682     const SuperCluster* cluster1 = static_cast<const ChargedParticle*>(c->Daughter(0))->Trk()->SCluster();
683     const SuperCluster* cluster2 = static_cast<const ChargedParticle*>(c->Daughter(1))->Trk()->SCluster();
684     for (UInt_t j=0; j<c->NDaughters(); ++j) {
685     const ChargedParticle* dc = dynamic_cast<const ChargedParticle*>(c->Daughter(j));
686 bendavid 1.3 const Electron *e = MatchingElectron(dc,fTrkElectrons);
687 bendavid 1.2 if (e) {
688     //printf("Matching Electron added\n");
689     if (cluster1 && cluster1!=cluster2)
690     if (!goodTwoClusterElectrons->HasObject(e))
691     goodTwoClusterElectrons->Add(e);
692    
693     if ( !goodElectrons->HasObject(e) )
694     goodElectrons->Add(e);
695     }
696 bendavid 1.1 }
697 bendavid 1.2
698     if (simPhoton && !simFailed.NBitsSet() ) {
699    
700     //if (c->Position().Rho() < fRhoMax)
701     hSimMatchedGammaMass->Fill(c->Mass());
702     hSimMatchedConvResolution->Fill(c->Position().Rho() - simPhoton->DecayVertex().Rho());
703     hSimMatchedConvPhiRes->Fill(c->Position().Phi() - simPhoton->DecayVertex().Phi());
704    
705 bendavid 1.1 for (UInt_t j=0; j<c->NDaughters(); ++j) {
706     const Particle* d = c->Daughter(j);
707     const ChargedParticle* dc = dynamic_cast<const ChargedParticle*>(d);
708     if (dc) {
709     const Track* t = dc->Trk();
710 bendavid 1.2 hSimMatchedTrackD0->Fill(t->D0());
711 bendavid 1.1 }
712     }
713 bendavid 1.2 }
714 bendavid 1.1 }
715 bendavid 1.2 }
716     hNConversions->Fill(nConversions);
717 bendavid 1.1
718 bendavid 1.2 //Fill bad electron collection (all electrons, but with good electrons from conversions removed)
719     LoadBranch(fElectronName);
720     for (UInt_t i = 0; i<fElectrons->GetEntries(); ++i) {
721 bendavid 1.3 const Electron *e = fElectrons->At(i);
722 bendavid 1.2 const Electron *goodElectronMatch = MatchingElectron(e,goodElectrons);
723     if (!goodElectronMatch)
724     badElectrons->Add(e);
725 bendavid 1.1 }
726 bendavid 1.2
727     AddObjThisEvt(goodElectrons, fGoodElectronsName.Data());
728 bendavid 1.3 AddObjThisEvt(goodTwoClusterElectrons, fGoodTwoClusterElectronsName.Data());
729 bendavid 1.2 AddObjThisEvt(badElectrons, fBadElectronsName.Data());
730 bendavid 1.1
731     // LoadBranch(fPhotonName);
732     for (UInt_t i=0; i<goodConversions.GetEntries(); i++) {
733 bendavid 1.3 const DecayParticle *conv1 = goodConversions.At(i);
734 bendavid 1.1 for (UInt_t j=i+1; j<goodConversions.GetEntries(); j++) {
735     DecayParticle *conv2 = goodConversions.At(j);
736     if (!conv2->HasCommonDaughter(conv1)) {
737     CompositeParticle pi0;
738     pi0.AddDaughter(conv1);
739     pi0.AddDaughter(conv2);
740     hDoubleConvMass->Fill(pi0.Mass());
741     }
742     }
743     // for (UInt_t j=0; j<fPhotons->GetEntries(); j++) {
744     // Photon *photon = fPhotons->At(j);
745     // if (PassPhotonCuts(photon)) {
746     // CompositeParticle pi0;
747     // pi0.AddDaughter(conv1);
748     // pi0.AddDaughter(photon);
749     // hConvGammaMass->Fill(pi0.Mass());
750     // }
751     // }
752     }
753    
754     }
755    
756     //__________________________________________________________________________________________________
757     void MvfConversions::SlaveTerminate()
758     {
759     // Run finishing code on the computer (slave) that did the analysis. For this module, we dont do
760     // anything here.
761     }
762    
763     //__________________________________________________________________________________________________
764     void MvfConversions::Terminate()
765     {
766    
767     fTimer.Stop();
768     printf("Total Analysis Time = %f\n",fTimer.CpuTime());
769    
770    
771     TCanvas* c1 = new TCanvas();
772     hConversionRadius->Draw();
773    
774     TCanvas* c2 = new TCanvas();
775     hConversionRPhi->Draw("col");
776     //c2->SetLogz();
777    
778     // Run finishing code on the client computer. For this module, we dont do anything here.
779     }
780    
781 bendavid 1.2 BitMask16 MvfConversions::FailedCuts(const DecayParticle* c) {
782 bendavid 1.1
783    
784     //if (p->GetVertex()->Prob() < 0.005)
785     // return false;
786     UInt_t nFailed = 0;
787    
788 bendavid 1.2 BitMask16 failed;
789    
790 bendavid 1.1 if ( c->NDaughters() != 2)
791 bendavid 1.2 failed.SetBit(eNDaughters);
792 bendavid 1.1
793     if ( c->Pt() < fPtMin )
794 bendavid 1.2 failed.SetBit(ePt);
795 bendavid 1.1
796     if ( !PassRho(c->Position().Rho()) )
797 bendavid 1.2 failed.SetBit(eRho);
798 bendavid 1.1
799     if ( TMath::Abs(c->Eta()) > fEtaMax )
800 bendavid 1.2 failed.SetBit(eEta);
801 bendavid 1.1
802     if ( c->Lxy() < fLxyMin || c->Lz() < fLzMin )
803 bendavid 1.2 failed.SetBit(eL);
804    
805 bendavid 1.1 if ( TMath::Abs(c->Dxy()) > fAbsDxyMax )
806 bendavid 1.2 failed.SetBit(eDxy);
807    
808 bendavid 1.1 if ( c->Charge() != 0 )
809 bendavid 1.2 failed.SetBit(eCharge);
810    
811 bendavid 1.1 Bool_t failedElectrons=false;
812     for (UInt_t i=0; i<c->NDaughters(); ++i) {
813     const DaughterData* d = c->DaughterDat(i);
814 bendavid 1.2 BitMask16 failedElectronCuts = FailedElectronCuts(d);
815     if (failedElectronCuts.NBitsSet())
816 bendavid 1.1 failedElectrons=true;
817     }
818     if (failedElectrons)
819 bendavid 1.2 failed.SetBit(eDaughters);
820 bendavid 1.1
821     if ( c->Prob() < fProbMin )
822 bendavid 1.2 failed.SetBit(eProb);
823 bendavid 1.1
824 bendavid 1.2 return failed;
825 bendavid 1.1 // LoadBranch(fMvfConvUnconstrainedName);
826     // const DecayParticle *unconstrained = MatchingConversion(c, fMvfConversionsUnconstrained);
827     //
828     // if (!unconstrained)
829     // nFailed++;
830     //
831     // if ( TwoPionMass(unconstrained) > 0.4 )
832     // nFailed++;
833     //hConvDCotTheta->Fill(dCotTheta);
834    
835     }
836    
837     Bool_t MvfConversions::PassConvCuts(const Conversion* p) {
838     if (p->NDaughters() != 2)
839     return false;
840    
841     Double_t convRadius = p->DecayVertex().Rho();
842     if (convRadius < 2.0)
843     //if (convRadius < 2.0 || convRadius > 20.0)
844     //if (convRadius < 20.0)
845     return false;
846    
847     const Electron* pElectron1 = (Electron*)p->Daughter(0);
848     const Electron* pElectron2 = (Electron*)p->Daughter(1);
849    
850    
851     //Double_t deltaPhi = TMath::ACos((pElectron1->Px()*pElectron2->Px() + pElectron1->Py()*pElectron2->Py() + pElectron1->Pz()*pElectron2->Pz())/(pElectron1->Mom().P()*pElectron2->Mom().P()));
852    
853     //if (deltaPhi>0.5)
854     // return false;
855     // if (fabs(p->DCotTheta())>0.2)
856     if (fabs(p->DCotTheta())>0.75)
857     return false;
858    
859     if (p->Charge()!=0)
860     return false;
861    
862    
863     /* for (Int_t i=0; i<p->NDaughters(); i++) {
864     const Electron* e = p->Daughter(i);
865     if (!PassElectronCuts(e))
866     return false;
867     } */
868     //if (p->Mass()<0.6)
869     // return false;
870    
871     //if (p->GetVertex().Prob() < 0.2)// || p->GetVertex().Prob() > 0.9)
872     // return false;
873    
874     return true;
875     }
876    
877 bendavid 1.2 BitMask16 MvfConversions::FailedElectronCuts(const DaughterData* d) {
878 bendavid 1.1 //if (p->Pt() < 5.0)
879     // return false;
880    
881 bendavid 1.2 BitMask16 failed;
882    
883 bendavid 1.1 if (d->Pt() < fElectronPtMin)
884 bendavid 1.2 failed.SetBit(eEPt);
885 bendavid 1.1
886     if (TMath::Abs(d->Eta()) > fElectronEtaMax)
887 bendavid 1.2 failed.SetBit(eEEta);
888 bendavid 1.1
889     const StableData *s = dynamic_cast<const StableData*>(d);
890    
891     if (!s)
892 bendavid 1.2 Fatal("FailedElectronCuts", "DaughterData not a StableData");
893 bendavid 1.1
894     const ChargedParticle* c = dynamic_cast<const ChargedParticle*>(s->Original());
895    
896     if (!c)
897 bendavid 1.2 Fatal("FailedElectronCuts", "Daughter not a ChargedParticle");
898 bendavid 1.1
899     const Track* t = c->Trk();
900 bendavid 1.2
901     if (!t)
902     Fatal("FailedElectronCuts", "Daughter has no track");
903 bendavid 1.1
904 bendavid 1.2 if (s->NMissedHits() > fMissedHitsMax)
905     failed.SetBit(eEMissedHits);
906    
907     if (s->NWrongHits() > fWrongHitsMax)
908     failed.SetBit(eEWrongHits);
909    
910     if (t->NHits()<fNHitsMin)
911     failed.SetBit(eENHits);
912    
913     if (t->Prob()<fTrackProbMin)
914     failed.SetBit(eEProb);
915 bendavid 1.1
916 bendavid 1.2 if (fExcludePXB1 && t->Hit(Track::PXB1))
917     failed.SetBit(eEPxb1);
918    
919     return failed;
920 bendavid 1.1 }
921    
922     Bool_t MvfConversions::PassTrackCuts(const Track* t) {
923    
924     // if ( t->Prob()<fTrackProbMin && t->NHits()<fNHitsMin )
925    
926     // if (t->NStereoHits() < 2)
927     // return false;
928    
929 bendavid 1.2 return false;
930 bendavid 1.1
931     }
932    
933 bendavid 1.2 BitMask16 MvfConversions::FailedSimCuts(const MCParticle* p) {
934 bendavid 1.1
935 bendavid 1.2 BitMask16 failed;
936 bendavid 1.1
937     if (p->PdgId()!=22)
938 bendavid 1.2 failed.SetBit(eSimPdg);
939 bendavid 1.1 if (TMath::Abs(p->Eta())>fEtaMax)
940 bendavid 1.2 failed.SetBit(eSimEta);
941 bendavid 1.1 //if (p->Pt()<5.0 || p->Pt()>25.0)
942     //if (p->Pt()<25.0)
943     if (p->Pt()<fPtMin)
944 bendavid 1.2 failed.SetBit(eSimPt);
945 bendavid 1.1
946     Double_t simRad = p->DecayVertex().Rho();
947     //if (simRad<2.0 || simRad>128.0)
948     //if (simRad<2.0 || simRad>20.0)
949     //if (simRad<20.0 || simRad>128.0)
950     if ( !PassRho(simRad) )
951 bendavid 1.2 failed.SetBit(eSimRho);
952 bendavid 1.1
953     Int_t nEPlus = 0;
954     Int_t nEMinus = 0;
955     Bool_t failedElectronPt=false;
956     Bool_t failedElectronEta=false;
957     for (UInt_t j=0; j<p->NDaughters(); j++) {
958     const MCParticle* pDaughter = p->Daughter(j);
959     if (pDaughter->PdgId()==11)
960     nEPlus++;
961     if (pDaughter->PdgId()==-11)
962     nEMinus++;
963     if (TMath::Abs(pDaughter->PdgId())==11) {
964     if (pDaughter->Pt() < fElectronPtMin)
965     failedElectronPt = true;
966     if (TMath::Abs(pDaughter->Eta()) > fElectronEtaMax)
967     failedElectronEta=true;
968     }
969     }
970     if (failedElectronPt)
971 bendavid 1.2 failed.SetBit(eSimElectronPt);
972 bendavid 1.1 if (failedElectronEta)
973 bendavid 1.2 failed.SetBit(eSimElectronEta);
974 bendavid 1.1
975     if (nEPlus!=1 || nEMinus!=1)
976 bendavid 1.2 failed.SetBit(eSimDaughters);
977 bendavid 1.1
978 bendavid 1.2 return failed;
979 bendavid 1.1 }
980    
981     const MCParticle* MvfConversions::SimMatch(const DecayParticle* p) {
982     if ( p->NDaughters()!=2 )
983     return 0;
984    
985     const ChargedParticle *electron1 = dynamic_cast<const ChargedParticle*>(p->Daughter(0));
986     const ChargedParticle *electron2 = dynamic_cast<const ChargedParticle*>(p->Daughter(1));
987    
988     if (!electron1 || !electron2)
989     return 0;
990    
991     const MCParticle *simElectron1 = electron1->Trk()->MCPart();
992     const MCParticle *simElectron2 = electron2->Trk()->MCPart();
993    
994    
995     if (simElectron1) {
996     hTrackSimMatchType->Fill(simElectron1->PdgId());
997     if (simElectron1->HasMother())
998     hParentSimMatchType->Fill(simElectron1->Mother()->PdgId());
999     }
1000    
1001     if (simElectron2) {
1002     hTrackSimMatchType->Fill(simElectron2->PdgId());
1003     if (simElectron2->HasMother())
1004     hParentSimMatchType->Fill(simElectron2->Mother()->PdgId());
1005     }
1006    
1007    
1008     if (!simElectron1) {
1009     const Track *t = electron1->Trk();
1010     hUnMatchedTrackChi2->Fill(t->Chi2()/((Double_t)t->Ndof()));
1011     hUnMatchedTrackProb->Fill(t->Prob());
1012     hUnMatchedTrackNHits->Fill(t->NHits());
1013     hUnMatchedTrackNHitsProb->Fill(t->NHits(),t->RChi2());
1014     hUnMatchedTrackD0->Fill(t->D0());
1015     }
1016    
1017     if (!simElectron2) {
1018     const Track *t = electron2->Trk();
1019     hUnMatchedTrackChi2->Fill(t->Chi2()/((Double_t)t->Ndof()));
1020     hUnMatchedTrackProb->Fill(t->Prob());
1021     hUnMatchedTrackNHits->Fill(t->NHits());
1022     hUnMatchedTrackNHitsProb->Fill(t->NHits(),t->RChi2());
1023     hUnMatchedTrackD0->Fill(t->D0());
1024     }
1025    
1026     if (!simElectron1 || !simElectron2) {
1027     //printf("unmatched electron\n");
1028     return 0;
1029     }
1030    
1031    
1032     if ( TMath::Abs(simElectron1->PdgId())!=11 || TMath::Abs(simElectron2->PdgId())!=11 ) {
1033     //printf("not electrons\n");
1034     return 0;
1035     }
1036    
1037     const MCParticle *simPhoton = simElectron1->DistinctMother();
1038    
1039     if (!simPhoton) {
1040     // printf("no photon\n");
1041     // hParentSimMatchType->Fill(0);
1042     return 0;
1043     }
1044    
1045     if (simElectron2->DistinctMother()!=simPhoton) {
1046     //printf("different mothers\n");
1047     // hParentSimMatchType->Fill(0);
1048     return 0;
1049     }
1050    
1051     if (simPhoton->PdgId()!=22) {
1052     //printf("not a photon\n");
1053     return 0;
1054     }
1055    
1056     // printf("found common mother with pdg=%i, daughter pdgs: %i, %i\n", simPhoton->PdgId(), simElectron1->PdgId(),simElectron2->PdgId());
1057    
1058     // hParentSimMatchType->Fill(simPhoton->PdgId());
1059    
1060     return simPhoton;
1061    
1062    
1063     }
1064    
1065     UInt_t MvfConversions::NTracks(const TrackCol *col)
1066     {
1067     UInt_t ntracks=0;
1068     for (UInt_t i=0; i<col->GetEntries(); ++i) {
1069     const Track *t = col->At(i);
1070     if ( PassTrackCuts(t) )
1071     ntracks++;
1072     }
1073    
1074     return ntracks;
1075     }
1076    
1077 bendavid 1.2 // Double_t MvfConversions::TrackPtIsolation(const DecayParticle *p, Double_t r)
1078     // {
1079     // TObjArray conversionTracks;
1080     // for (UInt_t i=0; i<p->NDaughters(); ++i) {
1081     // const ChargedParticle* d = dynamic_cast<const ChargedParticle*>(p->Daughter(i));
1082     // if (d) {
1083     // const Track *t = d->Trk();
1084     // if (t)
1085     // conversionTracks.Add((TObject*)t);
1086     // }
1087     // }
1088     //
1089     //
1090     // LoadBranch(fTrackName);
1091     // Double_t sumPt=0.0;
1092     // for (UInt_t i=0; i<fTracks->GetEntries(); ++i) {
1093     // const Track *t = fTracks->At(i);
1094     // if (conversionTracks.IndexOf(t)==-1) {
1095     // Double_t deltaR = MathUtils::DeltaR(p->Phi(),p->Eta(),t->Phi(),t->Eta());
1096     // if (deltaR<r)
1097     // sumPt = sumPt + 1.0;//sumPt += t->Pt();
1098     // }
1099     // }
1100     //
1101     // return sumPt;
1102     //
1103     // }
1104 bendavid 1.1
1105     Bool_t MvfConversions::PassPhotonCuts(const Photon *p)
1106     {
1107     if (p->IsConverted())
1108     return false;
1109    
1110     return true;
1111     }
1112    
1113     Double_t MvfConversions::DCotTheta(const DecayParticle *c)
1114     {
1115     if (c->NDaughters()!=2)
1116     return 0.0;
1117    
1118     Double_t theta1 = c->DaughterDat(0)->Theta();
1119     Double_t theta2 = c->DaughterDat(1)->Theta();
1120    
1121     Double_t dCotTheta = 1./TMath::Tan(theta1) - 1./TMath::Tan(theta2);
1122     //Double_t dCotTheta = c->DaughterDat(0)->Pt() - c->DaughterDat(1)->Pt();
1123    
1124     if (c->DaughterDat(0)->Charge()==1)
1125     return dCotTheta;
1126     else
1127     return (-dCotTheta);
1128     }
1129    
1130     Double_t MvfConversions::DPhi(const DecayParticle *c)
1131     {
1132     if (c->NDaughters()!=2)
1133     return 0.0;
1134    
1135     ThreeVector mom1 = ((const StableData*)c->DaughterDat(0))->ThreeMom();
1136     ThreeVector mom2 = ((const StableData*)c->DaughterDat(1))->ThreeMom();
1137    
1138     Double_t dPhi = TMath::ACos(mom1.Dot(mom2)/(mom1.R()*mom2.R()));
1139    
1140     return dPhi;
1141     }
1142    
1143     Double_t MvfConversions::TwoPionMass(const DecayParticle *c)
1144     {
1145     if (c->NDaughters()!=2)
1146     return 0.0;
1147    
1148     StableParticle *pi1 = new StableParticle(211, (Track*)((ChargedParticle*)c->Daughter(0))->Trk());
1149     StableParticle *pi2 = new StableParticle(211, (Track*)((ChargedParticle*)c->Daughter(1))->Trk());
1150    
1151     StableData *pi1d = new StableData(pi1, ((StableData*)c->DaughterDat(0))->ThreeMom());
1152     StableData *pi2d = new StableData(pi2, ((StableData*)c->DaughterDat(1))->ThreeMom());
1153    
1154     CompositeParticle *meson = new CompositeParticle();
1155     meson->AddDaughter(pi1d);
1156     meson->AddDaughter(pi2d);
1157    
1158     Double_t mesonMass = meson->Mass();
1159    
1160     delete meson;
1161     delete pi1d;
1162     delete pi2d;
1163     delete pi1;
1164     delete pi2;
1165    
1166     return mesonMass;
1167     }
1168    
1169     const DecayParticle *MvfConversions::MatchingConversion(const DecayParticle *c, const DecayParticleCol *col) const
1170     {
1171     for (UInt_t i=0; i<col->GetEntries(); ++i) {
1172     const DecayParticle *p = col->At(i);
1173     if ( p->HasSameDaughters(c) )
1174     return c;
1175     }
1176    
1177     return 0;
1178     }
1179    
1180 bendavid 1.3 const Electron *MvfConversions::MatchingElectron(const ChargedParticle *c, const ElectronCol *col) const
1181 bendavid 1.1 {
1182     for (UInt_t i=0; i<col->GetEntries(); ++i) {
1183 bendavid 1.3 const Electron *e = col->At(i);
1184 bendavid 1.2
1185     if ( c->Trk() == e->Trk() )
1186     return e;
1187 bendavid 1.1 }
1188    
1189 bendavid 1.2 return 0;
1190     }
1191    
1192 bendavid 1.3 const Electron *MvfConversions::MatchingElectron(const Electron *ein, const ElectronCol *col) const
1193 bendavid 1.2 {
1194     for (UInt_t i=0; i<col->GetEntries(); ++i) {
1195 bendavid 1.3 const Electron *e = col->At(i);
1196 bendavid 1.2
1197     if ( e->SCluster() == ein->SCluster() )
1198     return e;
1199     }
1200    
1201     return 0;
1202 bendavid 1.1 }
1203    
1204     void MvfConversions::AddRhoRange(Double_t lower, Double_t upper)
1205     {
1206     fRhoLbs.push_back(lower);
1207     fRhoUbs.push_back(upper);
1208     }
1209    
1210     Bool_t MvfConversions::PassRho(Double_t rho)
1211     {
1212     for (UInt_t i=0; i<fRhoLbs.size(); ++i) {
1213     if ( rho>fRhoLbs.at(i) && rho<fRhoUbs.at(i) )
1214     return true;
1215     }
1216    
1217     return false;
1218     }