Hall-D Software  alpha
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
JEventProcessor_CDC_Efficiency.cc
Go to the documentation of this file.
1 // $Id$
2 //
3 // File: JEventProcessor_CDC_Efficiency.cc
4 // Created: Tue Sep 9 15:41:38 EDT 2014
5 // Creator: hdcdcops (on Linux gluon05.jlab.org 2.6.32-358.18.1.el6.x86_64 x86_64)
6 //
7 
9 using namespace jana;
11 #include "CDC/DCDCDigiHit.h"
12 #include "DAQ/Df125CDCPulse.h"
13 #include "TRIGGER/DTrigger.h"
14 #include "HistogramTools.h"
15 
16 
17 // Routine used to create our JEventProcessor
18 #include <JANA/JApplication.h>
19 #include <JANA/JFactory.h>
20 extern "C"{
21 void InitPlugin(JApplication *app){
22  InitJANAPlugin(app);
23  app->AddProcessor(new JEventProcessor_CDC_Efficiency());
24 }
25 } // "C"
26 
27 
28 //------------------
29 // JEventProcessor_CDC_Efficiency (Constructor)
30 //------------------
32 {
33  ;
34 }
35 
36 //------------------
37 // ~JEventProcessor_CDC_Efficiency (Destructor)
38 //------------------
40 {
41  ;
42 }
43 
44 //------------------
45 // init
46 //------------------
48 {
49  dMinTrackingFOM = 5.73303E-7; // +/- 5 sigma
50  dMinNumRingsToEvalSuperlayer = 3; //technically, reconstruction minimum is 2 (TRKFIND:MIN_SEED_HITS) //but trust more with 3
51 
52  // For the overall 2D plots, thus DOCA cut is used
53  DOCACUT = 0.35;
54  if(gPARMS){
55  gPARMS->SetDefaultParameter("CDC_EFFICIENCY:DOCACUT", DOCACUT, "DOCA Cut on Efficiency Measurement");
56  }
57 
58 
59  // Reject tracks with momentum less than PCUTL
60  PCUTL = 0.5;
61  if(gPARMS){
62  gPARMS->SetDefaultParameter("CDC_EFFICIENCY:PCUTL", PCUTL, "Low momentum Cut on Efficiency Measurement");
63  }
64 
65  // Reject tracks with momentum greater than PCUTH
66  PCUTH = 6.0;
67  if(gPARMS){
68  gPARMS->SetDefaultParameter("CDC_EFFICIENCY:PCUTH", PCUTH, "High momentum Cut on Efficiency Measurement");
69  }
70 
71  // Fill extra histos requiring dE/dx > 0 if set to 1
72  FILL_DEDX_HISTOS = 0;
73  if(gPARMS){
74  gPARMS->SetDefaultParameter("CDC_EFFICIENCY:FILL_DEDX_HISTOS", FILL_DEDX_HISTOS, "Fill 'with dE/dx' histos if DOCA < CDC_GAIN_DOCA_PARS[0]");
75  }
76 
77 
78  for (unsigned int i=0; i < 28; i++){
79  for (unsigned int j=0; j < 209; j++){
80  ChannelFromRingStraw[i][j] = -1;
81  SlotFromRingStraw[i][j] = -1;
82  ChannelFromRingStraw[i][j] = -1;
83  }
84  }
85  // Some information
86 
87  int Nstraws[28] = {42, 42, 54, 54, 66, 66, 80, 80, 93, 93, 106, 106, 123, 123, 135, 135, 146, 146, 158, 158, 170, 170, 182, 182, 197, 197, 209, 209};
88 
89 
90  double radius[28] = {10.72134, 12.08024, 13.7795, 15.14602, 18.71726, 20.2438, 22.01672, 23.50008, 25.15616, 26.61158, 28.33624, 29.77388, 31.3817, 32.75838, 34.43478, 35.81146, 38.28542, 39.7002, 41.31564, 42.73042, 44.34078, 45.75302, 47.36084, 48.77054, 50.37582, 51.76012, 53.36286, 54.74716};
91  double phi[28] = {0, 0.074707844, 0.038166294, 0.096247609, 0.05966371, 0.012001551, 0.040721951, 0.001334527, 0.014963808, 0.048683644, 0.002092645, 0.031681749, 0.040719354, 0.015197341, 0.006786058, 0.030005892, 0.019704045, -0.001782064, -0.001306618, 0.018592421, 0.003686784, 0.022132975, 0.019600866, 0.002343723, 0.021301449, 0.005348855, 0.005997358, 0.021018761};
92 
93  // Define a different 2D histogram for each ring. X-axis is phi, Y-axis is radius (to plot correctly with "pol" option)
94 
95  // create root folder for cdc and cd to it, store main dir
96  TDirectory *main = gDirectory;
97  gDirectory->mkdir("CDC_Efficiency")->cd();
98  gDirectory->mkdir("CDC_View")->cd();
99 
100  cdc_measured_ring.resize(29);
101  cdc_expected_ring.resize(29);
102 
103  cdc_measured_with_dedx_ring.resize(29);
104 
105 
106  for(int locDOCABin = 0; locDOCABin < 8; ++locDOCABin)
107  {
108  cdc_measured_ringmap[locDOCABin].resize(29);
109  cdc_expected_ringmap[locDOCABin].resize(29);
110 
111  cdc_measured_with_dedx_ringmap[locDOCABin].resize(29);
112  }
113 
114  for(int iring=0; iring<28; iring++){
115  double r_start = radius[iring] - 0.8;
116  double r_end = radius[iring] + 0.8;
117  double phi_start = phi[iring]; // this is for center of straw. Need additional calculation for phi at end plate
118  double phi_end = phi_start + TMath::TwoPi();
119 
120  char hname_measured[256];
121  char hname_expected[256];
122  sprintf(hname_measured, "cdc_measured_ring[%d]", iring+1);
123  sprintf(hname_expected, "cdc_expected_ring[%d]", iring+1);
124 
125  cdc_measured_ring[iring+1] = new TH2D(hname_measured, "", Nstraws[iring], phi_start, phi_end, 1, r_start, r_end);
126 
127  cdc_measured_ringmap[0][iring+1] = new TH2D((TString)hname_measured +"DOCA0", "", Nstraws[iring], phi_start, phi_end, 1, r_start, r_end);
128  cdc_measured_ringmap[1][iring+1] = new TH2D((TString)hname_measured +"DOCA1", "", Nstraws[iring], phi_start, phi_end, 1, r_start, r_end);
129  cdc_measured_ringmap[2][iring+1] = new TH2D((TString)hname_measured +"DOCA2", "", Nstraws[iring], phi_start, phi_end, 1, r_start, r_end);
130  cdc_measured_ringmap[3][iring+1] = new TH2D((TString)hname_measured +"DOCA3", "", Nstraws[iring], phi_start, phi_end, 1, r_start, r_end);
131  cdc_measured_ringmap[4][iring+1] = new TH2D((TString)hname_measured +"DOCA4", "", Nstraws[iring], phi_start, phi_end, 1, r_start, r_end);
132  cdc_measured_ringmap[5][iring+1] = new TH2D((TString)hname_measured +"DOCA5", "", Nstraws[iring], phi_start, phi_end, 1, r_start, r_end);
133  cdc_measured_ringmap[6][iring+1] = new TH2D((TString)hname_measured +"DOCA6", "", Nstraws[iring], phi_start, phi_end, 1, r_start, r_end);
134  cdc_measured_ringmap[7][iring+1] = new TH2D((TString)hname_measured +"DOCA7", "", Nstraws[iring], phi_start, phi_end, 1, r_start, r_end);
135 
136  cdc_expected_ring[iring+1] = new TH2D(hname_expected, "", Nstraws[iring], phi_start, phi_end, 1, r_start, r_end);
137  cdc_expected_ringmap[0][iring+1] = new TH2D((TString)hname_expected + "DOCA0", "", Nstraws[iring], phi_start, phi_end, 1, r_start, r_end);
138  cdc_expected_ringmap[1][iring+1] = new TH2D((TString)hname_expected + "DOCA1", "", Nstraws[iring], phi_start, phi_end, 1, r_start, r_end);
139  cdc_expected_ringmap[2][iring+1] = new TH2D((TString)hname_expected + "DOCA2", "", Nstraws[iring], phi_start, phi_end, 1, r_start, r_end);
140  cdc_expected_ringmap[3][iring+1] = new TH2D((TString)hname_expected + "DOCA3", "", Nstraws[iring], phi_start, phi_end, 1, r_start, r_end);
141  cdc_expected_ringmap[4][iring+1] = new TH2D((TString)hname_expected + "DOCA4", "", Nstraws[iring], phi_start, phi_end, 1, r_start, r_end);
142  cdc_expected_ringmap[5][iring+1] = new TH2D((TString)hname_expected + "DOCA5", "", Nstraws[iring], phi_start, phi_end, 1, r_start, r_end);
143  cdc_expected_ringmap[6][iring+1] = new TH2D((TString)hname_expected + "DOCA6", "", Nstraws[iring], phi_start, phi_end, 1, r_start, r_end);
144  cdc_expected_ringmap[7][iring+1] = new TH2D((TString)hname_expected + "DOCA7", "", Nstraws[iring], phi_start, phi_end, 1, r_start, r_end);
145 
146  if (FILL_DEDX_HISTOS) {
147 
148  sprintf(hname_measured, "cdc_measured_with_dedx_ring[%d]", iring+1);
149  sprintf(hname_expected, "cdc_expected_with_dedx_ring[%d]", iring+1);
150 
151  cdc_measured_with_dedx_ring[iring+1] = new TH2D(hname_measured, "", Nstraws[iring], phi_start, phi_end, 1, r_start, r_end);
152 
153  cdc_measured_with_dedx_ringmap[0][iring+1] = new TH2D((TString)hname_measured +"DOCA0", "", Nstraws[iring], phi_start, phi_end, 1, r_start, r_end);
154  cdc_measured_with_dedx_ringmap[1][iring+1] = new TH2D((TString)hname_measured +"DOCA1", "", Nstraws[iring], phi_start, phi_end, 1, r_start, r_end);
155  cdc_measured_with_dedx_ringmap[2][iring+1] = new TH2D((TString)hname_measured +"DOCA2", "", Nstraws[iring], phi_start, phi_end, 1, r_start, r_end);
156  cdc_measured_with_dedx_ringmap[3][iring+1] = new TH2D((TString)hname_measured +"DOCA3", "", Nstraws[iring], phi_start, phi_end, 1, r_start, r_end);
157  cdc_measured_with_dedx_ringmap[4][iring+1] = new TH2D((TString)hname_measured +"DOCA4", "", Nstraws[iring], phi_start, phi_end, 1, r_start, r_end);
158  cdc_measured_with_dedx_ringmap[5][iring+1] = new TH2D((TString)hname_measured +"DOCA5", "", Nstraws[iring], phi_start, phi_end, 1, r_start, r_end);
159  cdc_measured_with_dedx_ringmap[6][iring+1] = new TH2D((TString)hname_measured +"DOCA6", "", Nstraws[iring], phi_start, phi_end, 1, r_start, r_end);
160  cdc_measured_with_dedx_ringmap[7][iring+1] = new TH2D((TString)hname_measured +"DOCA7", "", Nstraws[iring], phi_start, phi_end, 1, r_start, r_end);
161  }
162 
163  }
164 
165  gDirectory->cd("/CDC_Efficiency");
166  gDirectory->mkdir("Track_Quality")->cd();
167  hChi2OverNDF = new TH1I("hChi2OverNDF","hChi2OverNDF", 500, 0.0, 1.0);
168  ChargeVsTrackLength = new TH2I("ChargeVsTrackLength", "ChargeVsTrackLength", 1000, 0, 8.0, 2000, 0, 5000000);
169  hResVsT = new TH2I("hResVsT","Tracking Residual (Biased) Vs Drift Time; Drift Time [ns]; Residual [cm]", 500, 0.0, 700.0, 1000, -0.5, 0.5);
170  main->cd();
171 
172  dTargetCenterZ = 65.0;
173  dTargetLength = 30.0;
174 
175  return NOERROR;
176 }
177 
178 //------------------
179 // brun
180 //------------------
181 jerror_t JEventProcessor_CDC_Efficiency::brun(JEventLoop *eventLoop, int32_t runnumber)
182 {
183 
184  // This is called whenever the run number changes
185  DApplication* dapp=dynamic_cast<DApplication*>(eventLoop->GetJApplication());
186  dIsNoFieldFlag = (dynamic_cast<const DMagneticFieldMapNoField*>(dapp->GetBfield(runnumber)) != NULL);
187  JCalibration *jcalib = dapp->GetJCalibration(runnumber);
188  dgeom = dapp->GetDGeometry(runnumber);
189  //bfield = dapp->GetBfield();
190 
191  //Get Target Center Z, length
192  dgeom->GetTargetZ(dTargetCenterZ);
193  dgeom->GetTargetLength(dTargetLength);
194 
195  // Get the position of the CDC downstream endplate from DGeometry
196  //double endplate_z,endplate_dz,endplate_rmin,endplate_rmax;
197  //dgeom->GetCDCEndplate(endplate_z,endplate_dz,endplate_rmin,endplate_rmax);
198  dgeom->GetCDCWires(cdcwires);
199  unsigned int numstraws[28]={42,42,54,54,66,66,80,80,93,93,106,106,123,123,
200  135,135,146,146,158,158,170,170,182,182,197,197,
201  209,209};
202 
203  // Get the straw sag parameters from the database
204  vector< map<string, double> > tvals;
205  max_sag.clear();
206  sag_phi_offset.clear();
207  unsigned int straw_count=0,ring_count=0;
208  if (jcalib->Get("CDC/sag_parameters", tvals)==false){
209  vector<double>temp,temp2;
210  for(unsigned int i=0; i<tvals.size(); i++){
211  map<string, double> &row = tvals[i];
212 
213  temp.push_back(row["offset"]);
214  temp2.push_back(row["phi"]);
215 
216  straw_count++;
217  if (straw_count==numstraws[ring_count]){
218  max_sag.push_back(temp);
219  sag_phi_offset.push_back(temp2);
220  temp.clear();
221  temp2.clear();
222  straw_count=0;
223  ring_count++;
224  }
225  }
226  }
227 
228  // CDC correction for gain drop from progressive gas deterioration in spring 2018
229 
230  if (jcalib->Get("CDC/gain_doca_correction", CDC_GAIN_DOCA_PARS)) cout << "Error loading CDC/gain_doca_correction !" << endl;
231 
232 
233  MAX_DRIFT_TIME = 1000.0; //ns: from TRKFIND:MAX_DRIFT_TIME in DTrackCandidate_factory_CDC
234  //Make sure it gets initialize first, in case we want to change it:
235  if(!dIsNoFieldFlag){
236  vector<const DTrackCandidate*> locTrackCandidates;
237  eventLoop->Get(locTrackCandidates);
238  gPARMS->GetParameter("TRKFIND:MAX_DRIFT_TIME", MAX_DRIFT_TIME);
239  }
240 
241 
242  return NOERROR;
243 }
244 
245 //------------------
246 // evnt
247 //------------------
248 jerror_t JEventProcessor_CDC_Efficiency::evnt(JEventLoop *loop, uint64_t eventnumber){
249  const DTrigger* locTrigger = NULL;
250  loop->GetSingle(locTrigger);
251  if(locTrigger->Get_L1FrontPanelTriggerBits() != 0)
252  return NOERROR;
253  if (!locTrigger->Get_IsPhysicsEvent()){ // do not look at PS triggers
254  return NOERROR;
255  }
256 
257 
258  vector<const DTrackFitter *> fitters;
259  loop->Get(fitters);
260 
261  if(fitters.size()<1){
262  _DBG_<<"Unable to get a DTrackFinder object!"<<endl;
263  return RESOURCE_UNAVAILABLE;
264  }
265 
266  const DTrackFitter *fitter = fitters[0];
267 
268 
269  // Get the particle ID algorithms
270  vector<const DParticleID *> pid_algorithms;
271  loop->Get(pid_algorithms);
272  if(pid_algorithms.size()<1){
273  _DBG_<<"Unable to get a DParticleID object! NO PID will be done!"<<endl;
274  return RESOURCE_UNAVAILABLE;
275  }
276 
277  const DParticleID* pid_algorithm = pid_algorithms[0];
278 
279  //use CDC track hits: have drift time, can cut
280  vector< const DCDCTrackHit *> locCDCTrackHits;
281  loop->Get(locCDCTrackHits);
282 
283  //Pre-sort hits by ring to save time //only need to search within the given ring, straw
284  map<int, map<int, set<const DCDCTrackHit*> > > locSortedCDCTrackHits; //first int: ring //second int: straw
285  for(auto& locTrackHit : locCDCTrackHits)
286  {
287  if(locTrackHit->tdrift <= MAX_DRIFT_TIME)
288  locSortedCDCTrackHits[locTrackHit->wire->ring][locTrackHit->wire->straw].insert(locTrackHit);
289  }
290 
291  const DDetectorMatches *detMatches = nullptr;
292  if(!dIsNoFieldFlag)
293  loop->GetSingle(detMatches);
294 
295  const DParticleID *locParticleID = nullptr;
296  loop->GetSingle(locParticleID);
297 
298  vector <const DChargedTrack *> chargedTrackVector;
299  loop->Get(chargedTrackVector);
300 
301  vector <const DTrackTimeBased *> bestTimeBasedTracks;
302  if(!dIsNoFieldFlag){
303  for (unsigned int iTrack = 0; iTrack < chargedTrackVector.size(); iTrack++){
304  const DChargedTrackHypothesis* bestHypothesis = chargedTrackVector[iTrack]->Get_BestTrackingFOM();
305  bestTimeBasedTracks.push_back(bestHypothesis->Get_TrackTimeBased());
306  }
307  }
308  else{
309  loop->Get(bestTimeBasedTracks);
310  }
311 
312  for (unsigned int iTrack = 0; iTrack < bestTimeBasedTracks.size(); iTrack++){
313  auto thisTimeBasedTrack = bestTimeBasedTracks[iTrack];
314 
315  japp->RootFillLock(this); //ACQUIRE ROOT FILL LOCK
316  hChi2OverNDF->Fill(thisTimeBasedTrack->FOM);
317  japp->RootFillUnLock(this); //RELEASE ROOT FILL LOCK
318 
319  if (thisTimeBasedTrack->FOM < dMinTrackingFOM)
320  continue;
321 
322  //The cuts used for track quality
323  if(!dIsNoFieldFlag){ // Quality cuts for Field on runs.
324  if(thisTimeBasedTrack->ddEdx_CDC_amp > 1E-3) {
325  //cout << "Cut on dEdX" << endl;
326  continue; // Trying to cut out "proton" candidates
327  }
328  if(thisTimeBasedTrack->pmag() < PCUTL || thisTimeBasedTrack->pmag() > PCUTH) {
329  //cout << "Cut on momentum" << endl;
330  continue; // Cut on the reconstructed momentum to make sure we have the right
331  }
332  if(!detMatches->Get_IsMatchedToDetector(thisTimeBasedTrack, SYS_TOF) && !detMatches->Get_IsMatchedToDetector(thisTimeBasedTrack, SYS_BCAL))
333  {
334  //cout << "Cut on detector matches" << endl;
335  continue; // Require there to be at least one match to BCAL or TOF //not SC: lights up like xmas tree
336  }
337  if(fabs(thisTimeBasedTrack->position().Z() - dTargetCenterZ) > dTargetLength/2.0 || thisTimeBasedTrack->position().Perp() > 1.0) {
338  //cout << " Cut on vertex " << endl;
339  continue; // Cut on reconstructed vertex location
340  }
341  }
342  // Require many hits on the track for cosmics
343  else{
344  if(thisTimeBasedTrack->Ndof < 11) continue;
345  }
346 
347  // Require hits on at least 2 axial layers and at least 2 stereo layers:
348  // necessary to trust reconstructed phi & theta: respectable projection
349  set<int> locCDCRings;
350  locParticleID->Get_CDCRings(thisTimeBasedTrack->dCDCRings, locCDCRings);
351 
352  map<int, int> locNumHitRingsPerSuperlayer; //key: superlayer (1 -> 7) //axial: 1, 4, 7
353  locParticleID->Get_CDCNumHitRingsPerSuperlayer(locCDCRings, locNumHitRingsPerSuperlayer);
354 
355  int locNumSuperLayersWith2Hits_Axial = 0;
356  int locNumSuperLayersWith2Hits_Stereo = 0;
357  for(auto& locSuperlayerPair : locNumHitRingsPerSuperlayer)
358  {
359  if(locSuperlayerPair.second < 2)
360  continue;
361  if((locSuperlayerPair.first == 1) || (locSuperlayerPair.first == 4) || (locSuperlayerPair.first == 7))
362  ++locNumSuperLayersWith2Hits_Axial;
363  else
364  ++locNumSuperLayersWith2Hits_Stereo;
365  }
366 
367  if((locNumSuperLayersWith2Hits_Axial < 2) || (locNumSuperLayersWith2Hits_Stereo < 2))
368  continue; //don't trust the track projections
369 
370  // Alright now we truly have the tracks we are interested in for calculating the efficiency
371  //BUT, we need to make sure that we aren't biased by the fact that the track was reconstructed in the first place
372  //AND by our requirement above that there be at least 2 hits in a few superlayers
373  for(int locCDCSuperlayer = 1; locCDCSuperlayer <= 7; ++locCDCSuperlayer)
374  {
375  if(locNumHitRingsPerSuperlayer[locCDCSuperlayer] < dMinNumRingsToEvalSuperlayer)
376  continue;
377 
378  int locFirstRing = 4*(locCDCSuperlayer - 1) + 1;
379  if(locNumHitRingsPerSuperlayer[locCDCSuperlayer] == dMinNumRingsToEvalSuperlayer)
380  {
381  //All hits required: Can only evaluate the rings that do NOT have hits
382  for (int locRing = locFirstRing; locRing < locFirstRing + 4; ++locRing)
383  {
384  if(locCDCRings.find(locRing) == locCDCRings.end())
385 
386  //june12
387 
388  Fill_Efficiency_Histos(locRing, thisTimeBasedTrack, locSortedCDCTrackHits, pid_algorithm, fitter);
389 
390  }
391  continue;
392  }
393  //so many hits that no individual ring was required: evaluate for all
394  for (int locRing = locFirstRing; locRing < locFirstRing + 4; ++locRing)
395 
396  //june12
397  Fill_Efficiency_Histos(locRing, thisTimeBasedTrack, locSortedCDCTrackHits, pid_algorithm, fitter);
398  }
399  }
400  return NOERROR;
401 }
402 
403 
404 void JEventProcessor_CDC_Efficiency::Fill_Efficiency_Histos(unsigned int ringNum, const DTrackTimeBased *thisTimeBasedTrack, map<int, map<int, set<const DCDCTrackHit*> > >& locSortedCDCTrackHits, const DParticleID * pid_algorithm, const DTrackFitter *fitter)
405 {
406  vector<DTrackFitter::Extrapolation_t>extrapolations=thisTimeBasedTrack->extrapolations.at(SYS_CDC);
407  if (extrapolations.size()==0) return;
408 
409  int Nstraws_previous[28] = {0,42,84,138,192,258,324,404,484,577,670,776,882,1005,1128,1263,1398,1544,1690,1848,2006,2176,2346,2528,2710,2907,3104,3313};
410  vector< DCDCWire * > wireByNumber = cdcwires[ringNum - 1];
411  DVector3 pos;
412  DVector3 mom=thisTimeBasedTrack->momentum();
413  for (unsigned int wireIndex = 0; wireIndex < wireByNumber.size(); wireIndex++)
414  {
415  int wireNum = wireIndex+1;
416  DCDCWire * wire = wireByNumber[wireIndex];
417  double distanceToWire;
418  if(!dIsNoFieldFlag){
419  distanceToWire = fitter->DistToWire(wire,extrapolations,&pos,&mom);
420  }
421  else {
422  DVector3 POCAOnTrack, POCAOnWire;
423  distanceToWire = GetDOCAFieldOff(wire->origin, wire->udir,
424  thisTimeBasedTrack->position(),mom,
425  POCAOnTrack, POCAOnWire);
426  pos=POCAOnTrack;
427  }
428 
429  //SKIP IF NOT CLOSE - Field on
430  if(!dIsNoFieldFlag){
431  if(distanceToWire > 50.0)
432  {
433  wireIndex += 30;
434  continue;
435  }
436  if(distanceToWire > 20.0)
437  {
438  wireIndex += 10;
439  continue;
440  }
441  if(distanceToWire > 10.0)
442  {
443  wireIndex += 5;
444  continue;
445  }
446  }
447 
448  double delta = 0.0, dz = 0.0;
449  if(!Expect_Hit(thisTimeBasedTrack, wire, distanceToWire, pos, delta, dz))
450  continue;
451 
452  //FILL EXPECTED HISTOGRAMS
453  double dx = pid_algorithm->CalcdXHit(mom,pos,wire);
454  double locTheta = thisTimeBasedTrack->momentum().Theta()*TMath::RadToDeg();
455  Fill1DHistogram("CDC_Efficiency", "Offline", "Expected Hits Vs Path Length", dx, "Expected Hits", 100, 0 , 4.0);
456  Fill1DHistogram("CDC_Efficiency", "Offline", "Expected Hits Vs DOCA", distanceToWire, "Expected Hits", 100, 0 , 0.78);
457  Fill1DHistogram("CDC_Efficiency", "Offline", "Expected Hits Vs Tracking FOM", thisTimeBasedTrack->FOM, "Expected Hits", 100, 0 , 1.0);
458  Fill1DHistogram("CDC_Efficiency", "Offline", "Expected Hits Vs theta", locTheta, "Expected Hits", 100, 0, 180);
459  Fill1DHistogram("CDC_Efficiency", "Offline", "Expected Hits Vs p", thisTimeBasedTrack->pmag(), "Expected Hits", 100, 0 , 4.0);
460  Fill1DHistogram("CDC_Efficiency", "Offline", "Expected Hits Vs delta", delta, "Expected Hits", 100, -0.3 , 0.3);
461  Fill2DHistogram("CDC_Efficiency", "Offline", "Expected hits p Vs Theta", locTheta, thisTimeBasedTrack->pmag(), "Expected Hits", 100, 0, 180, 100, 0 , 4.0);
462  //expected hits by straw number
463  Fill1DHistogram("CDC_Efficiency", "Offline", "Expected Hits Vs N", Nstraws_previous[ringNum-1]+wireNum, "Expected Hits", 3522, 0.5, 3522.5);
464 
465  // look for a CDC hit match
466  // We need a backwards map from ring/straw to flash channel. Unfortunately there is no easy way
467  // Will construct the map manually
468  const DCDCTrackHit* locTrackHit = Find_Hit(ringNum, wireNum, locSortedCDCTrackHits[ringNum]);
469  const DCDCHit* locHit = nullptr;
470  if(locTrackHit != nullptr)
471  locTrackHit->GetSingle(locHit);
472 
473  bool foundHit = (locTrackHit != nullptr);
474 
475  bool foundHitWithdEdx = foundHit;
476  // hits with doca outside param 0 are ignored in dE/dx calc
477  if (distanceToWire > CDC_GAIN_DOCA_PARS[0]) foundHitWithdEdx = 0;
478 
479  if(foundHit)
480  {
481 
482  const DCDCDigiHit *thisDigiHit = NULL;
483  const Df125CDCPulse *thisPulse = NULL;
484  locHit->GetSingle(thisDigiHit);
485  if (thisDigiHit != NULL)
486  thisDigiHit->GetSingle(thisPulse);
487  if (thisPulse != NULL)
488  {
489  ROCIDFromRingStraw[ringNum - 1][wireNum - 1] = thisPulse->rocid;
490  SlotFromRingStraw[ringNum - 1][wireNum - 1] = thisPulse->slot;
491  ChannelFromRingStraw[ringNum - 1][wireNum - 1] = thisPulse->channel;
492  }
493 
494 
495 
496  Fill1DHistogram("CDC_Efficiency", "Offline", "Measured Hits Vs Path Length", dx, "Measured Hits", 100, 0 , 4.0);
497  Fill1DHistogram("CDC_Efficiency", "Offline", "Measured Hits Vs DOCA", distanceToWire, "Measured Hits", 100, 0 , 0.78);
498  Fill1DHistogram("CDC_Efficiency", "Offline", "Measured Hits Vs Tracking FOM", thisTimeBasedTrack->FOM, "Measured Hits", 100, 0 , 1.0);
499  Fill1DHistogram("CDC_Efficiency", "Offline", "Measured Hits Vs theta", locTheta, "Measured Hits", 100, 0, 180);
500  Fill1DHistogram("CDC_Efficiency", "Offline", "Measured Hits Vs p", thisTimeBasedTrack->pmag(), "Measured Hits", 100, 0 , 4.0);
501  Fill1DHistogram("CDC_Efficiency", "Offline", "Measured Hits Vs delta", delta, "Measured Hits", 100, -0.3 , 0.3);
502  Fill2DHistogram("CDC_Efficiency", "Offline", "Measured hits p Vs Theta", locTheta, thisTimeBasedTrack->pmag(), "Measured Hits", 100, 0, 180, 100, 0 , 4.0);
503 
504  //expected hits by straw number
505  Fill1DHistogram("CDC_Efficiency", "Offline", "Measured Hits Vs N", Nstraws_previous[ringNum-1]+wireNum, "Measured Hits", 3522, 0.5 , 3522.5);
506 
507  if (FILL_DEDX_HISTOS) {
508  if (foundHitWithdEdx) { // fill histos for which hit contributes to dE/dx
509  Fill1DHistogram("CDC_Efficiency", "Offline", "Measured Hits with dE/dx info Vs Path Length", dx, "Measured Hits with dE/dx info", 100, 0 , 4.0);
510  Fill1DHistogram("CDC_Efficiency", "Offline", "Measured Hits with dE/dx info Vs DOCA", distanceToWire, "Measured Hits with dE/dx info", 100, 0 , 0.78);
511  Fill1DHistogram("CDC_Efficiency", "Offline", "Measured Hits with dE/dx info Vs Tracking FOM", thisTimeBasedTrack->FOM, "Measured Hits with dE/dx info", 100, 0 , 1.0);
512  Fill1DHistogram("CDC_Efficiency", "Offline", "Measured Hits with dE/dx info Vs theta", locTheta, "Measured Hits with dE/dx info", 100, 0, 180);
513  Fill1DHistogram("CDC_Efficiency", "Offline", "Measured Hits with dE/dx info Vs p", thisTimeBasedTrack->pmag(), "Measured Hits with dE/dx info", 100, 0 , 4.0);
514  Fill1DHistogram("CDC_Efficiency", "Offline", "Measured Hits with dE/dx info Vs delta", delta, "Measured Hits with dE/dx info", 100, -0.3 , 0.3);
515  Fill2DHistogram("CDC_Efficiency", "Offline", "Measured Hits with dE/dx info p Vs Theta", locTheta, thisTimeBasedTrack->pmag(), "Measured Hits with dE/dx info", 100, 0, 180, 100, 0 , 4.0);
516 
517  //expected hits by straw number
518  Fill1DHistogram("CDC_Efficiency", "Offline", "Measured Hits with dE/dx info Vs N", Nstraws_previous[ringNum-1]+wireNum, "Measured Hits with dE/dx info", 3522, 0.5 , 3522.5);
519  }
520  }
521 
522  }
523 
524  //FILL PROFILES: BASED ON FOUND OR NOT
525  Fill1DProfile("CDC_Efficiency", "Online", "Efficiency Vs Path Length", dx,foundHit, "Efficiency; dx [cm]; Efficiency", 100, 0 , 4.0);
526  Fill1DProfile("CDC_Efficiency", "Online", "Efficiency Vs DOCA", distanceToWire,foundHit, "Efficiency; DOCA [cm]; Efficiency", 100, 0 , 0.78);
527  Fill1DProfile("CDC_Efficiency", "Online", "Efficiency Vs Tracking FOM", thisTimeBasedTrack->FOM,foundHit, "Efficiency; Tracking FOM; Efficiency", 100, 0 , 1.0);
528  Fill1DProfile("CDC_Efficiency", "Online", "Efficiency Vs theta", locTheta,foundHit, "Efficiency; Track #Theta [deg]; Efficiency", 100, 0, 180);
529  Fill1DProfile("CDC_Efficiency", "Online", "Efficiency Vs p", thisTimeBasedTrack->pmag(),foundHit, "Efficiency; Momentum [GeV]; Efficiency", 100, 0 , 4.0);
530  Fill1DProfile("CDC_Efficiency", "Online", "Efficiency Vs delta", delta,foundHit, "Efficiency; #delta [cm]; Efficiency", 100, -0.3 , 0.3);
531 
532  //expected hits by straw number
533  Fill1DProfile("CDC_Efficiency", "Online", "Efficiency Vs N", Nstraws_previous[ringNum-1]+wireNum, foundHit,"Efficiency; N; Efficiency", 3522, 0.5 , 3522.5);
534 
535  // repeat for hits contributing to dE/dx
536 
537  if (FILL_DEDX_HISTOS) {
538  Fill1DProfile("CDC_Efficiency", "Online", "Efficiency (with dE/dx) Vs Path Length", dx,foundHitWithdEdx, "Efficiency (with dE/dx); dx [cm]; Efficiency (with dE/dx)", 100, 0 , 4.0);
539  Fill1DProfile("CDC_Efficiency", "Online", "Efficiency (with dE/dx) Vs DOCA", distanceToWire,foundHitWithdEdx, "Efficiency (with dE/dx); DOCA [cm]; Efficiency (with dE/dx)", 100, 0 , 0.78);
540  Fill1DProfile("CDC_Efficiency", "Online", "Efficiency (with dE/dx) Vs Tracking FOM", thisTimeBasedTrack->FOM,foundHitWithdEdx, "Efficiency (with dE/dx); Tracking FOM; Efficiency (with dE/dx)", 100, 0 , 1.0);
541  Fill1DProfile("CDC_Efficiency", "Online", "Efficiency (with dE/dx) Vs theta", locTheta,foundHitWithdEdx, "Efficiency (with dE/dx); Track #Theta [deg]; Efficiency (with dE/dx)", 100, 0, 180);
542  Fill1DProfile("CDC_Efficiency", "Online", "Efficiency (with dE/dx) Vs p", thisTimeBasedTrack->pmag(),foundHitWithdEdx, "Efficiency (with dE/dx); Momentum [GeV]; Efficiency (with dE/dx)", 100, 0 , 4.0);
543  Fill1DProfile("CDC_Efficiency", "Online", "Efficiency (with dE/dx) Vs delta", delta,foundHitWithdEdx, "Efficiency (with dE/dx); #delta [cm]; Efficiency (with dE/dx)", 100, -0.3 , 0.3);
544 
545  //expected hits by straw number
546  Fill1DProfile("CDC_Efficiency", "Online", "Efficiency (with dE/dx) Vs N", Nstraws_previous[ringNum-1]+wireNum, foundHitWithdEdx,"Efficiency (with dE/dx); N; Efficiency (with dE/dx)", 3522, 0.5 , 3522.5);
547  }
548 
549 
550  if( ChannelFromRingStraw[ringNum - 1][wireNum - 1] != -1)
551  {
552  Fill1DProfile("CDC_Efficiency", "Online", "Efficiency Vs Channel Number", ChannelFromRingStraw[ringNum - 1][wireNum - 1],foundHit, "Efficiency; Channel Number; Efficiency", 73, -0.5 , 72.5);
553  char name [200];
554  sprintf(name, "Slot Efficiency ROCID %.2i", ROCIDFromRingStraw[ringNum - 1][wireNum - 1]);
555  Fill1DProfile("CDC_Efficiency", "Online", name, SlotFromRingStraw[ringNum - 1][wireNum - 1],foundHit, "Efficiency; Slot Number; Efficiency", 21, -0.5 , 20.5);
556  sprintf(name, "Channel Efficiency ROCID %.2i", ROCIDFromRingStraw[ringNum - 1][wireNum - 1]);
557  Fill1DProfile("CDC_Efficiency", "Online", name, SlotFromRingStraw[ringNum - 1][wireNum - 1] * 100 + ChannelFromRingStraw[ringNum - 1][wireNum - 1],foundHit, "Efficiency; Channel; Efficiency", 1501, 299.5 , 1800.5);
558 
559  if (FILL_DEDX_HISTOS) {
560  // repeat w dedx info
561  Fill1DProfile("CDC_Efficiency", "Online", "Efficiency (with dE/dx) Vs Channel Number", ChannelFromRingStraw[ringNum - 1][wireNum - 1],foundHitWithdEdx, "Efficiency (with dE/dx); Channel Number; Efficiency (with dE/dx)", 73, -0.5 , 72.5);
562  sprintf(name, "Slot Efficiency (with dE/dx) ROCID %.2i", ROCIDFromRingStraw[ringNum - 1][wireNum - 1]);
563  Fill1DProfile("CDC_Efficiency", "Online", name, SlotFromRingStraw[ringNum - 1][wireNum - 1],foundHitWithdEdx, "Efficiency (with dE/dx); Slot Number; Efficiency (with dE/dx)", 21, -0.5 , 20.5);
564  sprintf(name, "Channel Efficiency (with dE/dx) ROCID %.2i", ROCIDFromRingStraw[ringNum - 1][wireNum - 1]);
565  Fill1DProfile("CDC_Efficiency", "Online", name, SlotFromRingStraw[ringNum - 1][wireNum - 1] * 100 + ChannelFromRingStraw[ringNum - 1][wireNum - 1],foundHitWithdEdx, "Efficiency (with dE/dx); Channel; Efficiency (with dE/dx)", 1501, 299.5 , 1800.5);
566  }
567  }
568 
569  Fill2DProfile("CDC_Efficiency", "Online", "Efficiency p Vs Theta", locTheta, thisTimeBasedTrack->pmag(),foundHit, "Efficiency; Track #Theta [deg]; Momentum [GeV]", 100, 0, 180, 100, 0 , 4.0);
570  Fill2DProfile("CDC_Efficiency", "Online", "Efficiency distance Vs delta", delta,distanceToWire,foundHit, "Efficiency;#delta [cm]; DOCA [cm]", 100, -0.3, 0.3, 100, 0 , 1.2);
571  Fill2DProfile("CDC_Efficiency", "Online", "Efficiency z Vs delta", delta,dz,foundHit, "Efficiency;#delta [cm]; z [cm] (CDC local coordinates)", 100, -0.3, 0.3, 150, -75 , 75);
572 
573  if (FILL_DEDX_HISTOS) {
574  // repeat w dedx info
575  Fill2DProfile("CDC_Efficiency", "Online", "Efficiency (with dE/dx) p Vs Theta", locTheta, thisTimeBasedTrack->pmag(),foundHitWithdEdx, "Efficiency (with dE/dx); Track #Theta [deg]; Momentum [GeV]", 100, 0, 180, 100, 0 , 4.0);
576  Fill2DProfile("CDC_Efficiency", "Online", "Efficiency (with dE/dx) distance Vs delta", delta,distanceToWire,foundHitWithdEdx, "Efficiency (with dE/dx);#delta [cm]; DOCA [cm]", 100, -0.3, 0.3, 100, 0 , 1.2);
577  Fill2DProfile("CDC_Efficiency", "Online", "Efficiency (with dE/dx) z Vs delta", delta,dz,foundHitWithdEdx, "Efficiency (with dE/dx);#delta [cm]; z [cm] (CDC local coordinates)", 100, -0.3, 0.3, 150, -75 , 75);
578  }
579 
580 
581  //FILL AS FUNCTION OF DOCA
582  if (distanceToWire < 0.78)
583  {
584  Fill_ExpectedHit(ringNum, wireNum, distanceToWire);
585  if(foundHit)
586  //june12
587  Fill_MeasuredHit(foundHitWithdEdx, ringNum, wireNum, distanceToWire, pos, mom, wire,
588  locHit, pid_algorithm);
589  }
590  }
591 }
592 
593 bool JEventProcessor_CDC_Efficiency::Expect_Hit(const DTrackTimeBased* thisTimeBasedTrack, DCDCWire* wire, double distanceToWire, const DVector3 &pos,double& delta, double& dz)
594 {
595  delta = 0.0;
596  dz = 0.0;
597  if (distanceToWire >= 1.2 )
598  return false;
599 
600  // Form the vector between the wire and the DOCA point
601  DVector3 DOCA;
602 
603  if(!dIsNoFieldFlag) {
604  DOCA = (-1) * ((wire->origin - pos) - (wire->origin - pos).Dot(wire->udir) * wire->udir);
605  dz = (pos - wire->origin).Z();
606  }
607  else {
608  DVector3 POCAOnTrack, POCAOnWire;
609  GetDOCAFieldOff(wire->origin, wire->udir, thisTimeBasedTrack->position(), thisTimeBasedTrack->momentum(), POCAOnTrack, POCAOnWire);
610  DOCA = POCAOnTrack - POCAOnWire;
611  dz = (POCAOnWire - wire->origin).Z();
612  }
613 
614  double docaphi = DOCA.Phi();
615  //cout << "distanceToWire = " << distanceToWire << " DOCA = " << DOCA.Mag() << endl;
616  // Get delta at this location for this straw
617  int ring_index = wire->ring - 1;
618  int straw_index = wire->straw - 1;
619  delta = max_sag[ring_index][straw_index] * ( 1. - (dz*dz/5625.)) * TMath::Cos(docaphi + sag_phi_offset[ring_index][straw_index]);
620 
621  return (distanceToWire < (0.78 + delta) && fabs(dz) < 65.0);
622 }
623 
624 //june12
625 
626 void JEventProcessor_CDC_Efficiency::Fill_MeasuredHit(bool withdEdx, int ringNum, int wireNum, double distanceToWire, const DVector3 &pos, const DVector3 &mom, DCDCWire* wire, const DCDCHit* locHit, const DParticleID * pid_algorithm)
627 {
628  //Double_t w = cdc_occ_ring[ring]->GetBinContent(straw, 1) + 1.0;
629  //cdc_occ_ring[ring]->SetBinContent(straw, 1, w);
630  //Fill the expected number of hits histogram
631  if (distanceToWire < DOCACUT)
632  {
633  //printf("Matching Hit!!!!!\n");
634  japp->RootFillLock(this); //ACQUIRE ROOT FILL LOCK
635  {
636  Double_t v = cdc_measured_ring[ringNum]->GetBinContent(wireNum, 1) + 1.0;
637  cdc_measured_ring[ringNum]->SetBinContent(wireNum, 1, v);
638  double dx = pid_algorithm->CalcdXHit(mom,pos,wire);
639  ChargeVsTrackLength->Fill(dx, locHit->q);
640 
641  if (FILL_DEDX_HISTOS) {
642  if (withdEdx) {
643  Double_t vw = cdc_measured_with_dedx_ring[ringNum]->GetBinContent(wireNum, 1) + 1.0;
644  cdc_measured_with_dedx_ring[ringNum]->SetBinContent(wireNum, 1, vw);
645  }
646  }
647 
648  // ? Double_t w = cdc_expected_ring[ringNum]->GetBinContent(wireNum, 1) + 1.0;
649  // ? cdc_measured_ring[ringNum]->SetBinContent(wireNum, 1, w);
650  }
651  japp->RootFillUnLock(this); //RELEASE ROOT FILL LOCK
652  }
653 
654  int locDOCABin = (int) (distanceToWire * 10) % 8;
655  TH2D* locHistToFill = cdc_measured_ringmap[locDOCABin][ringNum];
656  japp->RootFillLock(this); //ACQUIRE ROOT FILL LOCK
657  {
658  Double_t w = locHistToFill->GetBinContent(wireNum, 1) + 1.0;
659  locHistToFill->SetBinContent(wireNum, 1, w);
660  }
661  japp->RootFillUnLock(this); //RELEASE ROOT FILL LOCK
662 
663  if (FILL_DEDX_HISTOS) {
664  if (withdEdx) {
665 
666  TH2D* locHistToFill = cdc_measured_with_dedx_ringmap[locDOCABin][ringNum];
667  japp->RootFillLock(this); //ACQUIRE ROOT FILL LOCK
668  {
669  Double_t w = locHistToFill->GetBinContent(wireNum, 1) + 1.0;
670  locHistToFill->SetBinContent(wireNum, 1, w);
671  }
672  japp->RootFillUnLock(this); //RELEASE ROOT FILL LOCK
673 
674  }
675  }
676 }
677 
678 void JEventProcessor_CDC_Efficiency::Fill_ExpectedHit(int ringNum, int wireNum, double distanceToWire)
679 {
680  //Double_t w = cdc_occ_ring[ring]->GetBinContent(straw, 1) + 1.0;
681  //cdc_occ_ring[ring]->SetBinContent(straw, 1, w);
682  //Fill the expected number of hits histogram
683  if (distanceToWire < DOCACUT)
684  {
685  japp->RootFillLock(this); //ACQUIRE ROOT FILL LOCK
686  {
687  Double_t w = cdc_expected_ring[ringNum]->GetBinContent(wireNum, 1) + 1.0;
688  cdc_expected_ring[ringNum]->SetBinContent(wireNum, 1, w);
689  }
690  japp->RootFillUnLock(this); //RELEASE ROOT FILL LOCK
691  }
692 
693  int locDOCABin = (int) (distanceToWire * 10) % 8;
694  TH2D* locHistToFill = cdc_expected_ringmap[locDOCABin][ringNum];
695  japp->RootFillLock(this); //ACQUIRE ROOT FILL LOCK
696  {
697  Double_t w = locHistToFill->GetBinContent(wireNum, 1) + 1.0;
698  locHistToFill->SetBinContent(wireNum, 1, w);
699  }
700  japp->RootFillUnLock(this); //RELEASE ROOT FILL LOCK
701 }
702 
703 const DCDCTrackHit* JEventProcessor_CDC_Efficiency::Find_Hit(int locRing, int locProjectedStraw, map<int, set<const DCDCTrackHit*> >& locSortedCDCTrackHits)
704 {
705  if(!locSortedCDCTrackHits[locProjectedStraw].empty())
706  return *(locSortedCDCTrackHits[locProjectedStraw].begin());
707 
708  int locNumStraws = cdcwires[locRing - 1].size();
709 
710  //previous straw
711  int locSearchStraw = locProjectedStraw - 1;
712  if(locSearchStraw <= 0)
713  locSearchStraw += locNumStraws;
714  if(!locSortedCDCTrackHits[locSearchStraw].empty())
715  return *(locSortedCDCTrackHits[locProjectedStraw].begin());
716 
717  //next straw
718  locSearchStraw = locProjectedStraw + 1;
719  if(locSearchStraw > locNumStraws)
720  locSearchStraw -= locNumStraws;
721  if(!locSortedCDCTrackHits[locSearchStraw].empty())
722  return *(locSortedCDCTrackHits[locProjectedStraw].begin());
723 
724  return nullptr;
725 }
726 
727 double JEventProcessor_CDC_Efficiency::GetDOCAFieldOff(DVector3 wirePosition, DVector3 wireDirection, DVector3 trackPosition, DVector3 trackMomentum, DVector3 &POCAOnTrack, DVector3 &POCAOnWire){
728  // Get the vector pointing from the wire to the doca point
729  Float_t a = trackMomentum.Dot(trackMomentum);
730  Float_t b = trackMomentum.Dot(wireDirection);
731  Float_t c = wireDirection.Dot(wireDirection);
732  DVector3 w0 = trackPosition - wirePosition;
733  Float_t d = trackMomentum.Dot(w0);
734  Float_t e = wireDirection.Dot(w0);
735  Float_t sc = ((b*e - c*d)/(a*c-b*b));
736  Float_t tc = ((a*e - b*d)/(a*c-b*b));
737  //if (sc < 0) continue; // Track must come from location away from origin
738  POCAOnTrack = trackPosition + sc * trackMomentum;
739  POCAOnWire = wirePosition + tc * wireDirection;
740  DVector3 LOCA = w0 + sc*trackMomentum - tc*wireDirection;
741  return LOCA.Mag();
742 }
743 
744 //------------------
745 // erun
746 //------------------
748 {
749  // This is called whenever the run number changes, before it is
750  // changed to give you a chance to clean up before processing
751  // events from the next run number.
752  return NOERROR;
753 }
754 
755 //------------------
756 // fini
757 //------------------
759 {
760  return NOERROR;
761 }
762 
static TH1I * hChi2OverNDF
DApplication * dapp
void Get_CDCRings(unsigned int locBitPattern, set< int > &locCDCRings) const
void Fill1DProfile(const char *plugin, const char *directoryName, const char *name, const double valueX, const double valueY, const char *title, int nBinsX, double xmin, double xmax, bool print=false)
bool Expect_Hit(const DTrackTimeBased *thisTimeBasedTrack, DCDCWire *wire, double distanceToWire, const DVector3 &pos, double &delta, double &dz)
The DTrackFitter class is a base class for different charged track fitting algorithms. It does not actually fit the track itself, but provides the interface and some common support features most algorthims will need to implement.
Definition: DTrackFitter.h:61
double pmag(void) const
TVector3 DVector3
Definition: DVector3.h:14
jerror_t erun(void)
Called everytime run number changes, provided brun has been called.
sprintf(text,"Post KinFit Cut")
#define c
void Fill_MeasuredHit(bool withdEdx, int ringNum, int wireNum, double distanceToWire, const DVector3 &pos, const DVector3 &mom, DCDCWire *wire, const DCDCHit *locHit, const DParticleID *pid_algorithm)
DMagneticFieldMap * GetBfield(unsigned int run_number=1)
const DVector3 & position(void) const
const DTrackTimeBased * Get_TrackTimeBased(void) const
uint32_t Get_L1FrontPanelTriggerBits(void) const
double CalcdXHit(const DVector3 &mom, const DVector3 &pos, const DCoordinateSystem *wire) const
Definition: DParticleID.cc:568
Definition: GlueX.h:17
Definition: GlueX.h:19
jerror_t fini(void)
Called after last event of last event source has been processed.
JApplication * japp
bool Get_IsPhysicsEvent(void) const
void Get_CDCNumHitRingsPerSuperlayer(int locBitPattern, map< int, int > &locNumHitRingsPerSuperlayer) const
jerror_t brun(jana::JEventLoop *eventLoop, int32_t runnumber)
Called everytime a new run number is detected.
TEllipse * e
InitPlugin_t InitPlugin
Definition: GlueX.h:20
void Fill_Efficiency_Histos(unsigned int ringNum, const DTrackTimeBased *thisTimeBasedTrack, map< int, map< int, set< const DCDCTrackHit * > > > &locSorteDCDCTrackHits, const DParticleID *pid_algorithm, const DTrackFitter *fitter)
int straw
Definition: DCDCWire.h:81
DGeometry * GetDGeometry(unsigned int run_number)
#define _DBG_
Definition: HDEVIO.h:12
void Fill1DHistogram(const char *plugin, const char *directoryName, const char *name, const double value, const char *title, int nBins, double xmin, double xmax, bool print=false)
static TH2I * hResVsT[25]
void Fill2DHistogram(const char *plugin, const char *directoryName, const char *name, const double valueX, const double valueY, const char *title, int nBinsX, double xmin, double xmax, int nBinsY, double ymin, double ymax, bool print=false)
float q
Definition: DCDCHit.h:20
double GetDOCAFieldOff(DVector3, DVector3, DVector3, DVector3, DVector3 &, DVector3 &)
const DCDCTrackHit * Find_Hit(int locRing, int locProjectedStraw, map< int, set< const DCDCTrackHit * > > &locSorteDCDCTrackHits)
const DVector3 & momentum(void) const
uint32_t channel
Definition: DDAQAddress.h:34
void Fill_ExpectedHit(int ringNum, int wireNum, double distanceToWire)
jerror_t init(void)
Called once at program start.
const DTrackFitter * fitter
int ring
Definition: DCDCWire.h:80
uint32_t rocid
Definition: DDAQAddress.h:32
jerror_t evnt(jana::JEventLoop *eventLoop, uint64_t eventnumber)
Called every event.
map< DetectorSystem_t, vector< DTrackFitter::Extrapolation_t > > extrapolations
void Fill2DProfile(const char *plugin, const char *directoryName, const char *name, const double valueX, const double valueY, const double valueZ, const char *title, int nBinsX, double xmin, double xmax, int nBinsY, double ymin, double ymax, bool print=false)
TH2F * temp
bool GetTargetZ(double &z_target) const
z-location of center of target
Definition: DGeometry.cc:1933
bool Get_IsMatchedToDetector(const DTrackingData *locTrack, DetectorSystem_t locDetectorSystem) const
int main(int argc, char *argv[])
Definition: gendoc.cc:6
double DistToWire(const DCoordinateSystem *wire, const vector< Extrapolation_t > &extrapolations, DVector3 *pos=NULL, DVector3 *mom=NULL, DVector3 *position_along_wire=NULL) const
uint32_t slot
Definition: DDAQAddress.h:33