Hall-D Software  alpha
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
DEventProcessor_dirc_hists.cc
Go to the documentation of this file.
1 // -----------------------------------------
2 // DEventProcessor_dirc_hists.cc
3 // -----------------------------------------
4 
6 
7 // Routine used to create our DEventProcessor
8 extern "C" {
9  void InitPlugin(JApplication *app) {
10  InitJANAPlugin(app);
11  app->AddProcessor(new DEventProcessor_dirc_hists());
12  }
13 }
14 
16 }
17 
19 }
20 
22 
23  DIRC_TRUTH_BARHIT = false;
24  if(gPARMS->Exists("DIRC:TRUTH_BARHIT"))
25  gPARMS->GetParameter("DIRC:TRUTH_BARHIT",DIRC_TRUTH_BARHIT);
26 
27  TDirectory *dir = new TDirectoryFile("DIRC","DIRC");
28  dir->cd();
29 
30  // list of particle IDs for histograms (and alternate hypotheses for likelihood diff)
31  deque<TString> locLikelihoodName;
32  dFinalStatePIDs.push_back(Positron); locLikelihoodName.push_back("ln L(e+) - ln L(#pi+)");
33  dFinalStatePIDs.push_back(Electron); locLikelihoodName.push_back("ln L(e-) - ln L(#pi-)");
34  dFinalStatePIDs.push_back(PiPlus); locLikelihoodName.push_back("ln L(#pi+) - ln L(K+)");
35  dFinalStatePIDs.push_back(PiMinus); locLikelihoodName.push_back("ln L(#pi-) - ln L(K-)");
36  dFinalStatePIDs.push_back(KPlus); locLikelihoodName.push_back("ln L(#pi+) - ln L(K+)");
37  dFinalStatePIDs.push_back(KMinus); locLikelihoodName.push_back("ln L(#pi-) - ln L(K-)");
38  dFinalStatePIDs.push_back(Proton); locLikelihoodName.push_back("ln L(K+) - ln L(p)");
39  dFinalStatePIDs.push_back(AntiProton); locLikelihoodName.push_back("ln L(K-) - ln L(#bar{p}");
40 
41  dMaxChannels = 108*64;
42 
43  // plots for each bar
44  TDirectory *locBarDir = new TDirectoryFile("PerBarDiagnostic","PerBarDiagnostic");
45  locBarDir->cd();
46  for(int i=0; i<24; i++) {
47  hDiffBar[i] = new TH2I(Form("hDiff_bar%02d",i), Form("Bar %02d; Channel ID; t_{calc}-t_{measured} [ns]; entries [#]", i), dMaxChannels, 0, dMaxChannels, 400,-20,20);
48  hNphCBar[i] = new TH1I(Form("hNphC_bar%02d",i), Form("Bar %02d; # photons", i), 150, 0, 150);
49  hNphCBarVsP[i] = new TH2I(Form("hNphCVsP_bar%d",i), Form("Bar %02d # photons vs. momentum; p (GeV/c); # photons", i), 120, 0, 12.0, 150, 0, 150);
50  hNphCBarInclusive[i] = new TH1I(Form("hNphCInclusive_bar%02d",i), Form("Bar %02d; # photons", i), 150, 0, 150);
51  hNphCBarInclusiveVsP[i] = new TH2I(Form("hNphCInclusiveVsP_bar%d",i), Form("Bar %02d # photons vs. momentum; p (GeV/c); # photons", i), 120, 0, 12.0, 150, 0, 150);
52  }
53  dir->cd();
54 
55  // plots for each hypothesis
56  for(uint loc_i=0; loc_i<dFinalStatePIDs.size(); loc_i++) {
57  Particle_t locPID = dFinalStatePIDs[loc_i];
58  string locParticleName = ParticleType(locPID);
59  string locParticleROOTName = ParticleName_ROOT(locPID);
60 
61  TDirectory *locParticleDir = new TDirectoryFile(locParticleName.data(),locParticleName.data());
62  locParticleDir->cd();
63 
64  hExtrapolatedBarHitXY[locPID] = new TH2I(Form("hExtrapolatedBarHitXY_%s",locParticleName.data()), "; Bar Hit X (cm); Bar Hit Y (cm)", 200, -100, 100, 200, -100, 100);
65  hDiff[locPID] = new TH1I(Form("hDiff_%s",locParticleName.data()), Form("; %s t_{calc}-t_{measured} [ns]; entries [#]", locParticleName.data()), 400,-100,100);
66  hDiffVsChannelDirect[locPID] = new TH2I(Form("hDiffVsChannelDirect_%s",locParticleName.data()), Form("; Channel ID; %s t_{calc}-t_{measured} [ns]; entries [#]",locParticleName.data()), dMaxChannels, 0, dMaxChannels, 400,-20,20);
67  hDiffVsChannelReflected[locPID] = new TH2I(Form("hDiffVsChannelReflected_%s",locParticleName.data()), Form("; Channel ID; %s t_{calc}-t_{measured} [ns]; entries [#]",locParticleName.data()), dMaxChannels, 0, dMaxChannels, 400,-20,20);
68  hNphC[locPID] = new TH1I(Form("hNphC_%s",locParticleName.data()), Form("# photons; %s # photons", locParticleROOTName.data()), 150, 0, 150);
69  hNphCInclusive[locPID] = new TH1I(Form("hNphCInclusive_%s",locParticleName.data()), Form("# photons; %s # photons", locParticleROOTName.data()), 150, 0, 150);
70  hThetaC[locPID] = new TH1I(Form("hThetaC_%s",locParticleName.data()), Form("cherenkov angle; %s #theta_{C} [rad]", locParticleROOTName.data()), 250, 0.6, 1.0);
71  hDeltaThetaC[locPID] = new TH1I(Form("hDeltaThetaC_%s",locParticleName.data()), Form("cherenkov angle; %s #Delta#theta_{C} [rad]", locParticleROOTName.data()), 200,-0.2,0.2);
72  hLikelihood[locPID] = new TH1I(Form("hLikelihood_%s",locParticleName.data()), Form("; %s -lnL; entries [#]", locParticleROOTName.data()),1000,0.,1000.);
73  hLikelihoodDiff[locPID] = new TH1I(Form("hLikelihoodDiff_%s",locParticleName.data()), Form("; %s;entries [#]", locLikelihoodName[loc_i].Data()),100,-200.,200.);
74 
75 
76  hNphCVsP[locPID] = new TH2I(Form("hNphCVsP_%s",locParticleName.data()), Form("# photons vs. momentum; p (GeV/c); %s # photons", locParticleROOTName.data()), 120, 0, 12.0, 150, 0, 150);
77  hNphCInclusiveVsP[locPID] = new TH2I(Form("hNphCInclusiveVsP_%s",locParticleName.data()), Form("# photons vs. momentum; p (GeV/c); %s # photons", locParticleROOTName.data()), 120, 0, 12.0, 150, 0, 150);
78  hThetaCVsP[locPID] = new TH2I(Form("hThetaCVsP_%s",locParticleName.data()), Form("cherenkov angle vs. momentum; p (GeV/c); %s #theta_{C} [rad]", locParticleROOTName.data()), 120, 0.0, 12.0, 250, 0.75, 0.85);
79  hDeltaThetaCVsP[locPID] = new TH2I(Form("hDeltaThetaCVsP_%s",locParticleName.data()), Form("cherenkov angle vs. momentum; p (GeV/c); %s #Delta#theta_{C} [rad]", locParticleROOTName.data()), 120, 0.0, 12.0, 200,-0.2,0.2);
80  hLikelihoodDiffVsP[locPID] = new TH2I(Form("hLikelihoodDiffVsP_%s",locParticleName.data()), Form("; p (GeV/c); %s", locLikelihoodName[loc_i].Data()), 120, 0.0, 12.0, 100, -200, 200);
81 
82  hDeltaTVsP[locPID] = new TH2I(Form("hDeltaTVsP_%s",locParticleName.data()), Form("#Delta T vs. momentum; p (GeV/c); %s #Delta T (ns)", locParticleROOTName.data()), 120, 0.0, 12.0, 200, -100, 100);
83 
84  dir->cd();
85  }
86 
87  int locBar = 3;
88  string locParticleName = "PiPlus";
89  // occupancy for fixed position and momentum
90  TDirectory *locMapDir = new TDirectoryFile("HitMapBar3","HitMapBar3");
91  locMapDir->cd();
92  for(int locXbin=0; locXbin<40; locXbin++) {
93  double xbin_min = -100.0 + locXbin*5.0;
94  double xbin_max = xbin_min + 5.0;
95 
96  hHitTimeMap[locXbin] = new TH1I(Form("hHitTimeMap_%s_%d_%d",locParticleName.data(),locBar,locXbin), Form("Bar %d, xbin [%0.0f,%0.0f]; t_{measured} [ns]; entries [#]",locBar,xbin_min,xbin_max), 100,0,100);
97  hPixelHitMap[locXbin] = new TH2S(Form("hPixelHit_%s_%d_%d",locParticleName.data(),locBar,locXbin), Form("Bar %d, xbin [%0.0f,%0.0f]; pixel rows; pixel columns", locBar,xbin_min,xbin_max), 144, -0.5, 143.5, 48, -0.5, 47.5);
98  hPixelHitMapReflected[locXbin] = new TH2S(Form("hPixelHitReflected_%s_%d_%d",locParticleName.data(),locBar,locXbin), Form("Bar %d, xbin [%0.0f,%0.0f]; pixel rows; pixel columns", locBar,xbin_min,xbin_max), 144, -0.5, 143.5, 48, -0.5, 47.5);
99  }
100 
101  gDirectory->cd("/");
102 
103  return NOERROR;
104 }
105 
106 jerror_t DEventProcessor_dirc_hists::brun(jana::JEventLoop *loop, int32_t runnumber)
107 {
108 
109  return NOERROR;
110 }
111 
112 jerror_t DEventProcessor_dirc_hists::evnt(JEventLoop *loop, uint64_t eventnumber) {
113 
114  // check trigger type
115  const DTrigger* locTrigger = NULL;
116  loop->GetSingle(locTrigger);
117  if(!locTrigger->Get_IsPhysicsEvent())
118  return NOERROR;
119 
120  // get PID algos
121  const DParticleID* locParticleID = NULL;
122  loop->GetSingle(locParticleID);
123 
124  vector<const DDIRCGeometry*> locDIRCGeometryVec;
125  loop->Get(locDIRCGeometryVec);
126  auto locDIRCGeometry = locDIRCGeometryVec[0];
127 
128  // Initialize DIRC LUT
129  const DDIRCLut* dDIRCLut = nullptr;
130  loop->GetSingle(dDIRCLut);
131 
132  // retrieve tracks and detector matches
133  vector<const DTrackTimeBased*> locTimeBasedTracks;
134  loop->Get(locTimeBasedTracks);
135 
136  vector<const DDIRCPmtHit*> locDIRCPmtHits;
137  loop->Get(locDIRCPmtHits);
138 
139  const DDetectorMatches* locDetectorMatches = NULL;
140  loop->GetSingle(locDetectorMatches);
141  DDetectorMatches locDetectorMatch = (DDetectorMatches)locDetectorMatches[0];
142 
143  // plot DIRC LUT variables for specific tracks
144  for (unsigned int loc_i = 0; loc_i < locTimeBasedTracks.size(); loc_i++){
145 
146  const DTrackTimeBased* locTrackTimeBased = locTimeBasedTracks[loc_i];
147 
148  // require well reconstructed tracks for initial studies
149  int locDCHits = locTrackTimeBased->Ndof + 5;
150  double locTheta = locTrackTimeBased->momentum().Theta()*180/TMath::Pi();
151  double locP = locTrackTimeBased->momentum().Mag();
152  if(locDCHits < 15 || locTheta < 1.0 || locTheta > 12.0 || locP > 12.0)
153  continue;
154 
155  // require has good match to TOF hit for cleaner sample
156  shared_ptr<const DTOFHitMatchParams> locTOFHitMatchParams;
157  bool foundTOF = locParticleID->Get_BestTOFMatchParams(locTrackTimeBased, locDetectorMatches, locTOFHitMatchParams);
158  if(!foundTOF || locTOFHitMatchParams->dDeltaXToHit > 10.0 || locTOFHitMatchParams->dDeltaYToHit > 10.0)
159  continue;
160 
161  Particle_t locPID = locTrackTimeBased->PID();
162  double locMass = ParticleMass(locPID);
163 
164  // get DIRC match parameters (contains LUT information)
165  shared_ptr<const DDIRCMatchParams> locDIRCMatchParams;
166  bool foundDIRC = locParticleID->Get_DIRCMatchParams(locTrackTimeBased, locDetectorMatches, locDIRCMatchParams);
167 
168  if(foundDIRC) {
169 
170  TVector3 posInBar = locDIRCMatchParams->dExtrapolatedPos;
171  TVector3 momInBar = locDIRCMatchParams->dExtrapolatedMom;
172  double locExpectedThetaC = locDIRCMatchParams->dExpectedThetaC;
173  double locExtrapolatedTime = locDIRCMatchParams->dExtrapolatedTime;
174  int locBar = locDIRCGeometry->GetBar(posInBar.Y());
175  if(locBar > 23) continue; // skip north box for now
176 
177  japp->RootFillLock(this); //ACQUIRE ROOT FILL LOCK
178  hExtrapolatedBarHitXY[locPID]->Fill(posInBar.X(), posInBar.Y());
179  japp->RootFillUnLock(this); //RELEASE ROOT FILL LOCK
180 
181  double locAngle = dDIRCLut->CalcAngle(momInBar, locMass);
182  map<Particle_t, double> locExpectedAngle = dDIRCLut->CalcExpectedAngles(momInBar);
183 
184  // get map of DIRCMatches to PMT hits
185  map<shared_ptr<const DDIRCMatchParams>, vector<const DDIRCPmtHit*> > locDIRCTrackMatchParamsMap;
186  locDetectorMatch.Get_DIRCTrackMatchParamsMap(locDIRCTrackMatchParamsMap);
187  map<Particle_t, double> logLikelihoodSum;
188 
189  int locPhotonInclusive = 0;
190 
191  // loop over associated hits for LUT diagnostic plots
192  for(uint loc_i=0; loc_i<locDIRCPmtHits.size(); loc_i++) {
193  vector<pair<double, double>> locDIRCPhotons = dDIRCLut->CalcPhoton(locDIRCPmtHits[loc_i], locExtrapolatedTime, posInBar, momInBar, locExpectedAngle, locAngle, locPID, logLikelihoodSum);
194  double locHitTime = locDIRCPmtHits[loc_i]->t - locExtrapolatedTime;
195  int locChannel = locDIRCPmtHits[loc_i]->ch%dMaxChannels;
196  if(locHitTime > 0 && locHitTime < 100) locPhotonInclusive++;
197 
198  int pixel_row = locDIRCGeometry->GetPixelRow(locChannel);
199  int pixel_col = locDIRCGeometry->GetPixelColumn(locChannel);
200 
201  // if find track which points to relevant bar, fill photon yield and matched
202  int locXbin = (int)(posInBar.X()/5.0) + 19;
203  if(locXbin >= 0 && locXbin < 40 && locBar == 3 && locPID == PiPlus && momInBar.Mag() > 4.0) {
204 
205  japp->RootFillLock(this); //ACQUIRE ROOT FILL LOCK
206  hHitTimeMap[locXbin]->Fill(locHitTime);
207  if(locHitTime < 38)
208  hPixelHitMap[locXbin]->Fill(pixel_row, pixel_col);
209  else
210  hPixelHitMapReflected[locXbin]->Fill(pixel_row, pixel_col);
211  japp->RootFillUnLock(this); //RELEASE ROOT FILL LOCK
212  }
213 
214  if(locDIRCPhotons.size() > 0) {
215 
216  // loop over candidate photons
217  for(uint loc_j = 0; loc_j<locDIRCPhotons.size(); loc_j++) {
218  double locDeltaT = locDIRCPhotons[loc_j].first - locHitTime;
219  double locThetaC = locDIRCPhotons[loc_j].second;
220 
221  japp->RootFillLock(this); //ACQUIRE ROOT FILL LOCK
222 
223  if(fabs(locThetaC-locExpectedThetaC)<0.05) {
224  hDiff[locPID]->Fill(locDeltaT);
225  if(locHitTime < 38)
226  hDiffVsChannelDirect[locPID]->Fill(locChannel,locDeltaT);
227  else
228  hDiffVsChannelReflected[locPID]->Fill(locChannel,locDeltaT);
229  if(locPID == PiPlus || locPID == PiMinus)
230  hDiffBar[locBar]->Fill(locChannel,locDeltaT);
231  }
232 
233  // fill histograms for candidate photons in timing cut
234  if(fabs(locDeltaT) < 100.0) {
235  hThetaC[locPID]->Fill(locThetaC);
236  hDeltaThetaC[locPID]->Fill(locThetaC-locExpectedThetaC);
237  hDeltaThetaCVsP[locPID]->Fill(momInBar.Mag(), locThetaC-locExpectedThetaC);
238 
239  }
240 
241  japp->RootFillUnLock(this); //RELEASE ROOT FILL LOCK
242  }
243  }
244  }
245 
246  // remove final states not considered
247  if(std::find(dFinalStatePIDs.begin(),dFinalStatePIDs.end(),locPID) == dFinalStatePIDs.end())
248  continue;
249 
250  japp->RootFillLock(this); //ACQUIRE ROOT FILL LOCK
251 
252  // fill histograms with per-track quantities
253  hNphC[locPID]->Fill(locDIRCMatchParams->dNPhotons);
254  hNphCInclusive[locPID]->Fill(locPhotonInclusive);
255  hNphCVsP[locPID]->Fill(momInBar.Mag(), locDIRCMatchParams->dNPhotons);
256  hNphCInclusiveVsP[locPID]->Fill(momInBar.Mag(), locPhotonInclusive);
257  hThetaCVsP[locPID]->Fill(momInBar.Mag(), locDIRCMatchParams->dThetaC);
258  hDeltaTVsP[locPID]->Fill(momInBar.Mag(), locDIRCMatchParams->dDeltaT);
259 
260  if(locPID == PiPlus || locPID == PiMinus) {
261  hNphCBar[locBar]->Fill(locDIRCMatchParams->dNPhotons);
262  hNphCBarInclusive[locBar]->Fill(locPhotonInclusive);
263  hNphCBarVsP[locBar]->Fill(momInBar.Mag(), locDIRCMatchParams->dNPhotons);
264  hNphCBarInclusiveVsP[locBar]->Fill(momInBar.Mag(), locPhotonInclusive);
265  }
266 
267  // for likelihood and difference for given track mass hypothesis
268  if(locPID == Positron || locPID == Electron) {
269  hLikelihood[locPID]->Fill(-1. * locDIRCMatchParams->dLikelihoodElectron);
270  hLikelihoodDiff[locPID]->Fill(locDIRCMatchParams->dLikelihoodElectron - locDIRCMatchParams->dLikelihoodPion);
271  hLikelihoodDiffVsP[locPID]->Fill(locP, locDIRCMatchParams->dLikelihoodElectron - locDIRCMatchParams->dLikelihoodPion);
272  }
273  else if(locPID == PiPlus || locPID == PiMinus) {
274  hLikelihood[locPID]->Fill(-1. * locDIRCMatchParams->dLikelihoodPion);
275  hLikelihoodDiff[locPID]->Fill(locDIRCMatchParams->dLikelihoodPion - locDIRCMatchParams->dLikelihoodKaon);
276  hLikelihoodDiffVsP[locPID]->Fill(locP, locDIRCMatchParams->dLikelihoodPion - locDIRCMatchParams->dLikelihoodKaon);
277  }
278  else if(locPID == KPlus || locPID == KMinus) {
279  hLikelihood[locPID]->Fill(-1. * locDIRCMatchParams->dLikelihoodKaon);
280  hLikelihoodDiff[locPID]->Fill(locDIRCMatchParams->dLikelihoodPion - locDIRCMatchParams->dLikelihoodKaon);
281  hLikelihoodDiffVsP[locPID]->Fill(locP, locDIRCMatchParams->dLikelihoodPion - locDIRCMatchParams->dLikelihoodKaon);
282  }
283  else if(locPID == Proton) {
284  hLikelihood[locPID]->Fill(-1. * locDIRCMatchParams->dLikelihoodProton);
285  hLikelihoodDiff[locPID]->Fill(locDIRCMatchParams->dLikelihoodProton - locDIRCMatchParams->dLikelihoodKaon);
286  hLikelihoodDiffVsP[locPID]->Fill(locP, locDIRCMatchParams->dLikelihoodProton - locDIRCMatchParams->dLikelihoodKaon);
287  }
288 
289  japp->RootFillUnLock(this); //RELEASE ROOT FILL LOCK
290  }
291  }
292 
293  return NOERROR;
294 }
295 
297  return NOERROR;
298 }
299 
301  return NOERROR;
302 }
map< Particle_t, TH2I * > hDeltaThetaCVsP
map< Particle_t, TH2I * > hDeltaTVsP
vector< pair< double, double > > CalcPhoton(const DDIRCPmtHit *locDIRCHit, double locFlightTime, TVector3 posInBar, TVector3 momInBar, map< Particle_t, double > locExpectedAngle, double locAngle, Particle_t locPID, map< Particle_t, double > &logLikelihoodSum, int &nPhotonsThetaC, double &meanThetaC, double &meanDeltaT, bool &isGood) const
Definition: DDIRCLut.cc:212
jerror_t evnt(JEventLoop *loop, uint64_t eventnumber)
static char * ParticleName_ROOT(Particle_t p)
Definition: particleType.h:851
map< Particle_t, TH1I * > hThetaC
jerror_t brun(jana::JEventLoop *loop, int32_t runnumber)
double CalcAngle(TVector3 momInBar, double locMass) const
Definition: DDIRCLut.cc:379
bool Get_DIRCTrackMatchParamsMap(map< shared_ptr< const DDIRCMatchParams >, vector< const DDIRCPmtHit * > > &locDIRCTrackMatchParamsMap)
map< Particle_t, TH2I * > hLikelihoodDiffVsP
map< Particle_t, TH1I * > hNphC
map< Particle_t, TH2I * > hNphCVsP
bool Get_DIRCMatchParams(const DTrackingData *locTrack, const DDetectorMatches *locDetectorMatches, shared_ptr< const DDIRCMatchParams > &locBestMatchParams) const
static char * ParticleType(Particle_t p)
Definition: particleType.h:142
map< Particle_t, TH2I * > hDiffVsChannelDirect
JApplication * japp
map< Particle_t, TH2I * > hExtrapolatedBarHitXY
bool Get_IsPhysicsEvent(void) const
bool Get_BestTOFMatchParams(const DTrackingData *locTrack, const DDetectorMatches *locDetectorMatches, shared_ptr< const DTOFHitMatchParams > &locBestMatchParams) const
InitPlugin_t InitPlugin
map< Particle_t, TH1I * > hDiff
map< Particle_t, TH1I * > hLikelihoodDiff
map< Particle_t, TH1I * > hLikelihood
int Ndof
Number of degrees of freedom in the fit.
static double ParticleMass(Particle_t p)
map< Particle_t, TH2I * > hDiffVsChannelReflected
map< Particle_t, TH1I * > hDeltaThetaC
const DVector3 & momentum(void) const
map< Particle_t, TH2I * > hNphCInclusiveVsP
map< Particle_t, double > CalcExpectedAngles(TVector3 momInBar) const
Definition: DDIRCLut.cc:383
map< Particle_t, TH1I * > hNphCInclusive
TDirectory * dir
Definition: bcal_hist_eff.C:31
map< Particle_t, TH2I * > hThetaCVsP
Particle_t PID(void) const
Particle_t
Definition: particleType.h:12