ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/MitConversions/Mods/src/MvfConversions.cc
Revision: 1.2
Committed: Mon Dec 1 18:32:42 2008 UTC (16 years, 5 months ago) by bendavid
Content type: text/plain
Branch: MAIN
Changes since 1.1: +339 -285 lines
Log Message:
changes with gsf conversion stuff

File Contents

# User Rev Content
1 bendavid 1.2 // $Id: MvfConversions.cc,v 1.1 2008/11/19 17:33:26 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     TAModule (name,title),
21     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     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     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     Electron *e = MatchingElectron(dc,fTrkElectrons);
687     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     Electron *e = fElectrons->At(i);
722     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     AddObjThisEvt(badElectrons, fBadElectronsName.Data());
729 bendavid 1.1
730     // LoadBranch(fPhotonName);
731     for (UInt_t i=0; i<goodConversions.GetEntries(); i++) {
732     DecayParticle *conv1 = goodConversions.At(i);
733     for (UInt_t j=i+1; j<goodConversions.GetEntries(); j++) {
734     DecayParticle *conv2 = goodConversions.At(j);
735     if (!conv2->HasCommonDaughter(conv1)) {
736     CompositeParticle pi0;
737     pi0.AddDaughter(conv1);
738     pi0.AddDaughter(conv2);
739     hDoubleConvMass->Fill(pi0.Mass());
740     }
741     }
742     // for (UInt_t j=0; j<fPhotons->GetEntries(); j++) {
743     // Photon *photon = fPhotons->At(j);
744     // if (PassPhotonCuts(photon)) {
745     // CompositeParticle pi0;
746     // pi0.AddDaughter(conv1);
747     // pi0.AddDaughter(photon);
748     // hConvGammaMass->Fill(pi0.Mass());
749     // }
750     // }
751     }
752    
753     }
754    
755     //__________________________________________________________________________________________________
756     void MvfConversions::SlaveTerminate()
757     {
758     // Run finishing code on the computer (slave) that did the analysis. For this module, we dont do
759     // anything here.
760     }
761    
762     //__________________________________________________________________________________________________
763     void MvfConversions::Terminate()
764     {
765    
766     fTimer.Stop();
767     printf("Total Analysis Time = %f\n",fTimer.CpuTime());
768    
769    
770     TCanvas* c1 = new TCanvas();
771     hConversionRadius->Draw();
772    
773     TCanvas* c2 = new TCanvas();
774     hConversionRPhi->Draw("col");
775     //c2->SetLogz();
776    
777     // Run finishing code on the client computer. For this module, we dont do anything here.
778     }
779    
780 bendavid 1.2 BitMask16 MvfConversions::FailedCuts(const DecayParticle* c) {
781 bendavid 1.1
782    
783     //if (p->GetVertex()->Prob() < 0.005)
784     // return false;
785     UInt_t nFailed = 0;
786    
787 bendavid 1.2 BitMask16 failed;
788    
789 bendavid 1.1 if ( c->NDaughters() != 2)
790 bendavid 1.2 failed.SetBit(eNDaughters);
791 bendavid 1.1
792     if ( c->Pt() < fPtMin )
793 bendavid 1.2 failed.SetBit(ePt);
794 bendavid 1.1
795     if ( !PassRho(c->Position().Rho()) )
796 bendavid 1.2 failed.SetBit(eRho);
797 bendavid 1.1
798     if ( TMath::Abs(c->Eta()) > fEtaMax )
799 bendavid 1.2 failed.SetBit(eEta);
800 bendavid 1.1
801     if ( c->Lxy() < fLxyMin || c->Lz() < fLzMin )
802 bendavid 1.2 failed.SetBit(eL);
803    
804 bendavid 1.1 if ( TMath::Abs(c->Dxy()) > fAbsDxyMax )
805 bendavid 1.2 failed.SetBit(eDxy);
806    
807 bendavid 1.1 if ( c->Charge() != 0 )
808 bendavid 1.2 failed.SetBit(eCharge);
809    
810 bendavid 1.1 Bool_t failedElectrons=false;
811     for (UInt_t i=0; i<c->NDaughters(); ++i) {
812     const DaughterData* d = c->DaughterDat(i);
813 bendavid 1.2 BitMask16 failedElectronCuts = FailedElectronCuts(d);
814     if (failedElectronCuts.NBitsSet())
815 bendavid 1.1 failedElectrons=true;
816     }
817     if (failedElectrons)
818 bendavid 1.2 failed.SetBit(eDaughters);
819 bendavid 1.1
820     if ( c->Prob() < fProbMin )
821 bendavid 1.2 failed.SetBit(eProb);
822 bendavid 1.1
823 bendavid 1.2 return failed;
824 bendavid 1.1 // LoadBranch(fMvfConvUnconstrainedName);
825     // const DecayParticle *unconstrained = MatchingConversion(c, fMvfConversionsUnconstrained);
826     //
827     // if (!unconstrained)
828     // nFailed++;
829     //
830     // if ( TwoPionMass(unconstrained) > 0.4 )
831     // nFailed++;
832     //hConvDCotTheta->Fill(dCotTheta);
833    
834     }
835    
836     Bool_t MvfConversions::PassConvCuts(const Conversion* p) {
837     if (p->NDaughters() != 2)
838     return false;
839    
840     Double_t convRadius = p->DecayVertex().Rho();
841     if (convRadius < 2.0)
842     //if (convRadius < 2.0 || convRadius > 20.0)
843     //if (convRadius < 20.0)
844     return false;
845    
846     const Electron* pElectron1 = (Electron*)p->Daughter(0);
847     const Electron* pElectron2 = (Electron*)p->Daughter(1);
848    
849    
850     //Double_t deltaPhi = TMath::ACos((pElectron1->Px()*pElectron2->Px() + pElectron1->Py()*pElectron2->Py() + pElectron1->Pz()*pElectron2->Pz())/(pElectron1->Mom().P()*pElectron2->Mom().P()));
851    
852     //if (deltaPhi>0.5)
853     // return false;
854     // if (fabs(p->DCotTheta())>0.2)
855     if (fabs(p->DCotTheta())>0.75)
856     return false;
857    
858     if (p->Charge()!=0)
859     return false;
860    
861    
862     /* for (Int_t i=0; i<p->NDaughters(); i++) {
863     const Electron* e = p->Daughter(i);
864     if (!PassElectronCuts(e))
865     return false;
866     } */
867     //if (p->Mass()<0.6)
868     // return false;
869    
870     //if (p->GetVertex().Prob() < 0.2)// || p->GetVertex().Prob() > 0.9)
871     // return false;
872    
873     return true;
874     }
875    
876 bendavid 1.2 BitMask16 MvfConversions::FailedElectronCuts(const DaughterData* d) {
877 bendavid 1.1 //if (p->Pt() < 5.0)
878     // return false;
879    
880 bendavid 1.2 BitMask16 failed;
881    
882 bendavid 1.1 if (d->Pt() < fElectronPtMin)
883 bendavid 1.2 failed.SetBit(eEPt);
884 bendavid 1.1
885     if (TMath::Abs(d->Eta()) > fElectronEtaMax)
886 bendavid 1.2 failed.SetBit(eEEta);
887 bendavid 1.1
888     const StableData *s = dynamic_cast<const StableData*>(d);
889    
890     if (!s)
891 bendavid 1.2 Fatal("FailedElectronCuts", "DaughterData not a StableData");
892 bendavid 1.1
893     const ChargedParticle* c = dynamic_cast<const ChargedParticle*>(s->Original());
894    
895     if (!c)
896 bendavid 1.2 Fatal("FailedElectronCuts", "Daughter not a ChargedParticle");
897 bendavid 1.1
898     const Track* t = c->Trk();
899 bendavid 1.2
900     if (!t)
901     Fatal("FailedElectronCuts", "Daughter has no track");
902 bendavid 1.1
903 bendavid 1.2 if (s->NMissedHits() > fMissedHitsMax)
904     failed.SetBit(eEMissedHits);
905    
906     if (s->NWrongHits() > fWrongHitsMax)
907     failed.SetBit(eEWrongHits);
908    
909     if (t->NHits()<fNHitsMin)
910     failed.SetBit(eENHits);
911    
912     if (t->Prob()<fTrackProbMin)
913     failed.SetBit(eEProb);
914 bendavid 1.1
915 bendavid 1.2 if (fExcludePXB1 && t->Hit(Track::PXB1))
916     failed.SetBit(eEPxb1);
917    
918     return failed;
919 bendavid 1.1 }
920    
921     Bool_t MvfConversions::PassTrackCuts(const Track* t) {
922    
923     // if ( t->Prob()<fTrackProbMin && t->NHits()<fNHitsMin )
924    
925     // if (t->NStereoHits() < 2)
926     // return false;
927    
928 bendavid 1.2 return false;
929 bendavid 1.1
930     }
931    
932 bendavid 1.2 BitMask16 MvfConversions::FailedSimCuts(const MCParticle* p) {
933 bendavid 1.1
934 bendavid 1.2 BitMask16 failed;
935 bendavid 1.1
936     if (p->PdgId()!=22)
937 bendavid 1.2 failed.SetBit(eSimPdg);
938 bendavid 1.1 if (TMath::Abs(p->Eta())>fEtaMax)
939 bendavid 1.2 failed.SetBit(eSimEta);
940 bendavid 1.1 //if (p->Pt()<5.0 || p->Pt()>25.0)
941     //if (p->Pt()<25.0)
942     if (p->Pt()<fPtMin)
943 bendavid 1.2 failed.SetBit(eSimPt);
944 bendavid 1.1
945     Double_t simRad = p->DecayVertex().Rho();
946     //if (simRad<2.0 || simRad>128.0)
947     //if (simRad<2.0 || simRad>20.0)
948     //if (simRad<20.0 || simRad>128.0)
949     if ( !PassRho(simRad) )
950 bendavid 1.2 failed.SetBit(eSimRho);
951 bendavid 1.1
952     Int_t nEPlus = 0;
953     Int_t nEMinus = 0;
954     Bool_t failedElectronPt=false;
955     Bool_t failedElectronEta=false;
956     for (UInt_t j=0; j<p->NDaughters(); j++) {
957     const MCParticle* pDaughter = p->Daughter(j);
958     if (pDaughter->PdgId()==11)
959     nEPlus++;
960     if (pDaughter->PdgId()==-11)
961     nEMinus++;
962     if (TMath::Abs(pDaughter->PdgId())==11) {
963     if (pDaughter->Pt() < fElectronPtMin)
964     failedElectronPt = true;
965     if (TMath::Abs(pDaughter->Eta()) > fElectronEtaMax)
966     failedElectronEta=true;
967     }
968     }
969     if (failedElectronPt)
970 bendavid 1.2 failed.SetBit(eSimElectronPt);
971 bendavid 1.1 if (failedElectronEta)
972 bendavid 1.2 failed.SetBit(eSimElectronEta);
973 bendavid 1.1
974     if (nEPlus!=1 || nEMinus!=1)
975 bendavid 1.2 failed.SetBit(eSimDaughters);
976 bendavid 1.1
977 bendavid 1.2 return failed;
978 bendavid 1.1 }
979    
980     const MCParticle* MvfConversions::SimMatch(const DecayParticle* p) {
981     if ( p->NDaughters()!=2 )
982     return 0;
983    
984     const ChargedParticle *electron1 = dynamic_cast<const ChargedParticle*>(p->Daughter(0));
985     const ChargedParticle *electron2 = dynamic_cast<const ChargedParticle*>(p->Daughter(1));
986    
987     if (!electron1 || !electron2)
988     return 0;
989    
990     const MCParticle *simElectron1 = electron1->Trk()->MCPart();
991     const MCParticle *simElectron2 = electron2->Trk()->MCPart();
992    
993    
994     if (simElectron1) {
995     hTrackSimMatchType->Fill(simElectron1->PdgId());
996     if (simElectron1->HasMother())
997     hParentSimMatchType->Fill(simElectron1->Mother()->PdgId());
998     }
999    
1000     if (simElectron2) {
1001     hTrackSimMatchType->Fill(simElectron2->PdgId());
1002     if (simElectron2->HasMother())
1003     hParentSimMatchType->Fill(simElectron2->Mother()->PdgId());
1004     }
1005    
1006    
1007     if (!simElectron1) {
1008     const Track *t = electron1->Trk();
1009     hUnMatchedTrackChi2->Fill(t->Chi2()/((Double_t)t->Ndof()));
1010     hUnMatchedTrackProb->Fill(t->Prob());
1011     hUnMatchedTrackNHits->Fill(t->NHits());
1012     hUnMatchedTrackNHitsProb->Fill(t->NHits(),t->RChi2());
1013     hUnMatchedTrackD0->Fill(t->D0());
1014     }
1015    
1016     if (!simElectron2) {
1017     const Track *t = electron2->Trk();
1018     hUnMatchedTrackChi2->Fill(t->Chi2()/((Double_t)t->Ndof()));
1019     hUnMatchedTrackProb->Fill(t->Prob());
1020     hUnMatchedTrackNHits->Fill(t->NHits());
1021     hUnMatchedTrackNHitsProb->Fill(t->NHits(),t->RChi2());
1022     hUnMatchedTrackD0->Fill(t->D0());
1023     }
1024    
1025     if (!simElectron1 || !simElectron2) {
1026     //printf("unmatched electron\n");
1027     return 0;
1028     }
1029    
1030    
1031     if ( TMath::Abs(simElectron1->PdgId())!=11 || TMath::Abs(simElectron2->PdgId())!=11 ) {
1032     //printf("not electrons\n");
1033     return 0;
1034     }
1035    
1036     const MCParticle *simPhoton = simElectron1->DistinctMother();
1037    
1038     if (!simPhoton) {
1039     // printf("no photon\n");
1040     // hParentSimMatchType->Fill(0);
1041     return 0;
1042     }
1043    
1044     if (simElectron2->DistinctMother()!=simPhoton) {
1045     //printf("different mothers\n");
1046     // hParentSimMatchType->Fill(0);
1047     return 0;
1048     }
1049    
1050     if (simPhoton->PdgId()!=22) {
1051     //printf("not a photon\n");
1052     return 0;
1053     }
1054    
1055     // printf("found common mother with pdg=%i, daughter pdgs: %i, %i\n", simPhoton->PdgId(), simElectron1->PdgId(),simElectron2->PdgId());
1056    
1057     // hParentSimMatchType->Fill(simPhoton->PdgId());
1058    
1059     return simPhoton;
1060    
1061    
1062     }
1063    
1064     UInt_t MvfConversions::NTracks(const TrackCol *col)
1065     {
1066     UInt_t ntracks=0;
1067     for (UInt_t i=0; i<col->GetEntries(); ++i) {
1068     const Track *t = col->At(i);
1069     if ( PassTrackCuts(t) )
1070     ntracks++;
1071     }
1072    
1073     return ntracks;
1074     }
1075    
1076 bendavid 1.2 // Double_t MvfConversions::TrackPtIsolation(const DecayParticle *p, Double_t r)
1077     // {
1078     // TObjArray conversionTracks;
1079     // for (UInt_t i=0; i<p->NDaughters(); ++i) {
1080     // const ChargedParticle* d = dynamic_cast<const ChargedParticle*>(p->Daughter(i));
1081     // if (d) {
1082     // const Track *t = d->Trk();
1083     // if (t)
1084     // conversionTracks.Add((TObject*)t);
1085     // }
1086     // }
1087     //
1088     //
1089     // LoadBranch(fTrackName);
1090     // Double_t sumPt=0.0;
1091     // for (UInt_t i=0; i<fTracks->GetEntries(); ++i) {
1092     // const Track *t = fTracks->At(i);
1093     // if (conversionTracks.IndexOf(t)==-1) {
1094     // Double_t deltaR = MathUtils::DeltaR(p->Phi(),p->Eta(),t->Phi(),t->Eta());
1095     // if (deltaR<r)
1096     // sumPt = sumPt + 1.0;//sumPt += t->Pt();
1097     // }
1098     // }
1099     //
1100     // return sumPt;
1101     //
1102     // }
1103 bendavid 1.1
1104     Bool_t MvfConversions::PassPhotonCuts(const Photon *p)
1105     {
1106     if (p->IsConverted())
1107     return false;
1108    
1109     return true;
1110     }
1111    
1112     Double_t MvfConversions::DCotTheta(const DecayParticle *c)
1113     {
1114     if (c->NDaughters()!=2)
1115     return 0.0;
1116    
1117     Double_t theta1 = c->DaughterDat(0)->Theta();
1118     Double_t theta2 = c->DaughterDat(1)->Theta();
1119    
1120     Double_t dCotTheta = 1./TMath::Tan(theta1) - 1./TMath::Tan(theta2);
1121     //Double_t dCotTheta = c->DaughterDat(0)->Pt() - c->DaughterDat(1)->Pt();
1122    
1123     if (c->DaughterDat(0)->Charge()==1)
1124     return dCotTheta;
1125     else
1126     return (-dCotTheta);
1127     }
1128    
1129     Double_t MvfConversions::DPhi(const DecayParticle *c)
1130     {
1131     if (c->NDaughters()!=2)
1132     return 0.0;
1133    
1134     ThreeVector mom1 = ((const StableData*)c->DaughterDat(0))->ThreeMom();
1135     ThreeVector mom2 = ((const StableData*)c->DaughterDat(1))->ThreeMom();
1136    
1137     Double_t dPhi = TMath::ACos(mom1.Dot(mom2)/(mom1.R()*mom2.R()));
1138    
1139     return dPhi;
1140     }
1141    
1142     Double_t MvfConversions::TwoPionMass(const DecayParticle *c)
1143     {
1144     if (c->NDaughters()!=2)
1145     return 0.0;
1146    
1147     StableParticle *pi1 = new StableParticle(211, (Track*)((ChargedParticle*)c->Daughter(0))->Trk());
1148     StableParticle *pi2 = new StableParticle(211, (Track*)((ChargedParticle*)c->Daughter(1))->Trk());
1149    
1150     StableData *pi1d = new StableData(pi1, ((StableData*)c->DaughterDat(0))->ThreeMom());
1151     StableData *pi2d = new StableData(pi2, ((StableData*)c->DaughterDat(1))->ThreeMom());
1152    
1153     CompositeParticle *meson = new CompositeParticle();
1154     meson->AddDaughter(pi1d);
1155     meson->AddDaughter(pi2d);
1156    
1157     Double_t mesonMass = meson->Mass();
1158    
1159     delete meson;
1160     delete pi1d;
1161     delete pi2d;
1162     delete pi1;
1163     delete pi2;
1164    
1165     return mesonMass;
1166     }
1167    
1168     const DecayParticle *MvfConversions::MatchingConversion(const DecayParticle *c, const DecayParticleCol *col) const
1169     {
1170     for (UInt_t i=0; i<col->GetEntries(); ++i) {
1171     const DecayParticle *p = col->At(i);
1172     if ( p->HasSameDaughters(c) )
1173     return c;
1174     }
1175    
1176     return 0;
1177     }
1178    
1179     Electron *MvfConversions::MatchingElectron(const ChargedParticle *c, ElectronCol *col) const
1180     {
1181     for (UInt_t i=0; i<col->GetEntries(); ++i) {
1182     Electron *e = col->At(i);
1183 bendavid 1.2
1184     if ( c->Trk() == e->Trk() )
1185     return e;
1186 bendavid 1.1 }
1187    
1188 bendavid 1.2 return 0;
1189     }
1190    
1191     Electron *MvfConversions::MatchingElectron(const Electron *ein, ElectronCol *col) const
1192     {
1193     for (UInt_t i=0; i<col->GetEntries(); ++i) {
1194     Electron *e = col->At(i);
1195    
1196     if ( e->SCluster() == ein->SCluster() )
1197     return e;
1198     }
1199    
1200     return 0;
1201 bendavid 1.1 }
1202    
1203     void MvfConversions::AddRhoRange(Double_t lower, Double_t upper)
1204     {
1205     fRhoLbs.push_back(lower);
1206     fRhoUbs.push_back(upper);
1207     }
1208    
1209     Bool_t MvfConversions::PassRho(Double_t rho)
1210     {
1211     for (UInt_t i=0; i<fRhoLbs.size(); ++i) {
1212     if ( rho>fRhoLbs.at(i) && rho<fRhoUbs.at(i) )
1213     return true;
1214     }
1215    
1216     return false;
1217     }