18 #include <JANA/JApplication.h>
19 #include <JANA/JFactory.h>
49 dMinTrackingFOM = 5.73303E-7;
50 dMinNumRingsToEvalSuperlayer = 3;
55 gPARMS->SetDefaultParameter(
"CDC_EFFICIENCY:DOCACUT", DOCACUT,
"DOCA Cut on Efficiency Measurement");
62 gPARMS->SetDefaultParameter(
"CDC_EFFICIENCY:PCUTL", PCUTL,
"Low momentum Cut on Efficiency Measurement");
68 gPARMS->SetDefaultParameter(
"CDC_EFFICIENCY:PCUTH", PCUTH,
"High momentum Cut on Efficiency Measurement");
74 gPARMS->SetDefaultParameter(
"CDC_EFFICIENCY:FILL_DEDX_HISTOS", FILL_DEDX_HISTOS,
"Fill 'with dE/dx' histos if DOCA < CDC_GAIN_DOCA_PARS[0]");
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;
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};
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};
96 TDirectory *
main = gDirectory;
97 gDirectory->mkdir(
"CDC_Efficiency")->cd();
98 gDirectory->mkdir(
"CDC_View")->cd();
100 cdc_measured_ring.resize(29);
101 cdc_expected_ring.resize(29);
103 cdc_measured_with_dedx_ring.resize(29);
106 for(
int locDOCABin = 0; locDOCABin < 8; ++locDOCABin)
108 cdc_measured_ringmap[locDOCABin].resize(29);
109 cdc_expected_ringmap[locDOCABin].resize(29);
111 cdc_measured_with_dedx_ringmap[locDOCABin].resize(29);
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];
118 double phi_end = phi_start + TMath::TwoPi();
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);
125 cdc_measured_ring[iring+1] =
new TH2D(hname_measured,
"", Nstraws[iring], phi_start, phi_end, 1, r_start, r_end);
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);
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);
146 if (FILL_DEDX_HISTOS) {
148 sprintf(hname_measured,
"cdc_measured_with_dedx_ring[%d]", iring+1);
149 sprintf(hname_expected,
"cdc_expected_with_dedx_ring[%d]", iring+1);
151 cdc_measured_with_dedx_ring[iring+1] =
new TH2D(hname_measured,
"", Nstraws[iring], phi_start, phi_end, 1, r_start, r_end);
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);
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);
172 dTargetCenterZ = 65.0;
173 dTargetLength = 30.0;
187 JCalibration *jcalib = dapp->GetJCalibration(runnumber);
193 dgeom->GetTargetLength(dTargetLength);
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,
204 vector< map<string, double> > tvals;
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];
213 temp.push_back(row[
"offset"]);
214 temp2.push_back(row[
"phi"]);
217 if (straw_count==numstraws[ring_count]){
218 max_sag.push_back(temp);
219 sag_phi_offset.push_back(temp2);
230 if (jcalib->Get(
"CDC/gain_doca_correction", CDC_GAIN_DOCA_PARS)) cout <<
"Error loading CDC/gain_doca_correction !" << endl;
233 MAX_DRIFT_TIME = 1000.0;
236 vector<const DTrackCandidate*> locTrackCandidates;
237 eventLoop->Get(locTrackCandidates);
238 gPARMS->GetParameter(
"TRKFIND:MAX_DRIFT_TIME", MAX_DRIFT_TIME);
250 loop->GetSingle(locTrigger);
258 vector<const DTrackFitter *> fitters;
261 if(fitters.size()<1){
262 _DBG_<<
"Unable to get a DTrackFinder object!"<<endl;
263 return RESOURCE_UNAVAILABLE;
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;
277 const DParticleID* pid_algorithm = pid_algorithms[0];
280 vector< const DCDCTrackHit *> locCDCTrackHits;
281 loop->Get(locCDCTrackHits);
284 map<int, map<int, set<const DCDCTrackHit*> > > locSortedCDCTrackHits;
285 for(
auto& locTrackHit : locCDCTrackHits)
287 if(locTrackHit->tdrift <= MAX_DRIFT_TIME)
288 locSortedCDCTrackHits[locTrackHit->wire->ring][locTrackHit->wire->straw].insert(locTrackHit);
293 loop->GetSingle(detMatches);
296 loop->GetSingle(locParticleID);
298 vector <const DChargedTrack *> chargedTrackVector;
299 loop->Get(chargedTrackVector);
301 vector <const DTrackTimeBased *> bestTimeBasedTracks;
303 for (
unsigned int iTrack = 0; iTrack < chargedTrackVector.size(); iTrack++){
309 loop->Get(bestTimeBasedTracks);
312 for (
unsigned int iTrack = 0; iTrack < bestTimeBasedTracks.size(); iTrack++){
313 auto thisTimeBasedTrack = bestTimeBasedTracks[iTrack];
315 japp->RootFillLock(
this);
317 japp->RootFillUnLock(
this);
319 if (thisTimeBasedTrack->FOM < dMinTrackingFOM)
324 if(thisTimeBasedTrack->ddEdx_CDC_amp > 1E-3) {
328 if(thisTimeBasedTrack->pmag() < PCUTL || thisTimeBasedTrack->pmag() > PCUTH) {
337 if(fabs(thisTimeBasedTrack->position().Z() - dTargetCenterZ) > dTargetLength/2.0 || thisTimeBasedTrack->position().Perp() > 1.0) {
344 if(thisTimeBasedTrack->Ndof < 11)
continue;
349 set<int> locCDCRings;
350 locParticleID->
Get_CDCRings(thisTimeBasedTrack->dCDCRings, locCDCRings);
352 map<int, int> locNumHitRingsPerSuperlayer;
355 int locNumSuperLayersWith2Hits_Axial = 0;
356 int locNumSuperLayersWith2Hits_Stereo = 0;
357 for(
auto& locSuperlayerPair : locNumHitRingsPerSuperlayer)
359 if(locSuperlayerPair.second < 2)
361 if((locSuperlayerPair.first == 1) || (locSuperlayerPair.first == 4) || (locSuperlayerPair.first == 7))
362 ++locNumSuperLayersWith2Hits_Axial;
364 ++locNumSuperLayersWith2Hits_Stereo;
367 if((locNumSuperLayersWith2Hits_Axial < 2) || (locNumSuperLayersWith2Hits_Stereo < 2))
373 for(
int locCDCSuperlayer = 1; locCDCSuperlayer <= 7; ++locCDCSuperlayer)
375 if(locNumHitRingsPerSuperlayer[locCDCSuperlayer] < dMinNumRingsToEvalSuperlayer)
378 int locFirstRing = 4*(locCDCSuperlayer - 1) + 1;
379 if(locNumHitRingsPerSuperlayer[locCDCSuperlayer] == dMinNumRingsToEvalSuperlayer)
382 for (
int locRing = locFirstRing; locRing < locFirstRing + 4; ++locRing)
384 if(locCDCRings.find(locRing) == locCDCRings.end())
388 Fill_Efficiency_Histos(locRing, thisTimeBasedTrack, locSortedCDCTrackHits, pid_algorithm, fitter);
394 for (
int locRing = locFirstRing; locRing < locFirstRing + 4; ++locRing)
397 Fill_Efficiency_Histos(locRing, thisTimeBasedTrack, locSortedCDCTrackHits, pid_algorithm, fitter);
407 if (extrapolations.size()==0)
return;
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];
413 for (
unsigned int wireIndex = 0; wireIndex < wireByNumber.size(); wireIndex++)
415 int wireNum = wireIndex+1;
416 DCDCWire * wire = wireByNumber[wireIndex];
417 double distanceToWire;
419 distanceToWire = fitter->
DistToWire(wire,extrapolations,&pos,&mom);
423 distanceToWire = GetDOCAFieldOff(wire->
origin, wire->
udir,
425 POCAOnTrack, POCAOnWire);
431 if(distanceToWire > 50.0)
436 if(distanceToWire > 20.0)
441 if(distanceToWire > 10.0)
448 double delta = 0.0, dz = 0.0;
449 if(!Expect_Hit(thisTimeBasedTrack, wire, distanceToWire, pos, delta, dz))
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);
463 Fill1DHistogram(
"CDC_Efficiency",
"Offline",
"Expected Hits Vs N", Nstraws_previous[ringNum-1]+wireNum,
"Expected Hits", 3522, 0.5, 3522.5);
468 const DCDCTrackHit* locTrackHit = Find_Hit(ringNum, wireNum, locSortedCDCTrackHits[ringNum]);
469 const DCDCHit* locHit =
nullptr;
470 if(locTrackHit !=
nullptr)
471 locTrackHit->GetSingle(locHit);
473 bool foundHit = (locTrackHit !=
nullptr);
475 bool foundHitWithdEdx = foundHit;
477 if (distanceToWire > CDC_GAIN_DOCA_PARS[0]) foundHitWithdEdx = 0;
484 locHit->GetSingle(thisDigiHit);
485 if (thisDigiHit != NULL)
486 thisDigiHit->GetSingle(thisPulse);
487 if (thisPulse != NULL)
489 ROCIDFromRingStraw[ringNum - 1][wireNum - 1] = thisPulse->
rocid;
490 SlotFromRingStraw[ringNum - 1][wireNum - 1] = thisPulse->
slot;
491 ChannelFromRingStraw[ringNum - 1][wireNum - 1] = thisPulse->
channel;
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);
505 Fill1DHistogram(
"CDC_Efficiency",
"Offline",
"Measured Hits Vs N", Nstraws_previous[ringNum-1]+wireNum,
"Measured Hits", 3522, 0.5 , 3522.5);
507 if (FILL_DEDX_HISTOS) {
508 if (foundHitWithdEdx) {
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);
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);
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);
533 Fill1DProfile(
"CDC_Efficiency",
"Online",
"Efficiency Vs N", Nstraws_previous[ringNum-1]+wireNum, foundHit,
"Efficiency; N; Efficiency", 3522, 0.5 , 3522.5);
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);
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);
550 if( ChannelFromRingStraw[ringNum - 1][wireNum - 1] != -1)
552 Fill1DProfile(
"CDC_Efficiency",
"Online",
"Efficiency Vs Channel Number", ChannelFromRingStraw[ringNum - 1][wireNum - 1],foundHit,
"Efficiency; Channel Number; Efficiency", 73, -0.5 , 72.5);
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);
559 if (FILL_DEDX_HISTOS) {
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);
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);
573 if (FILL_DEDX_HISTOS) {
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);
582 if (distanceToWire < 0.78)
584 Fill_ExpectedHit(ringNum, wireNum, distanceToWire);
587 Fill_MeasuredHit(foundHitWithdEdx, ringNum, wireNum, distanceToWire, pos, mom, wire,
588 locHit, pid_algorithm);
597 if (distanceToWire >= 1.2 )
603 if(!dIsNoFieldFlag) {
605 dz = (pos - wire->
origin).Z();
609 GetDOCAFieldOff(wire->
origin, wire->
udir, thisTimeBasedTrack->
position(), thisTimeBasedTrack->
momentum(), POCAOnTrack, POCAOnWire);
610 DOCA = POCAOnTrack - POCAOnWire;
611 dz = (POCAOnWire - wire->
origin).Z();
614 double docaphi = DOCA.Phi();
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]);
621 return (distanceToWire < (0.78 + delta) && fabs(dz) < 65.0);
631 if (distanceToWire < DOCACUT)
634 japp->RootFillLock(
this);
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);
641 if (FILL_DEDX_HISTOS) {
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);
651 japp->RootFillUnLock(
this);
654 int locDOCABin = (int) (distanceToWire * 10) % 8;
655 TH2D* locHistToFill = cdc_measured_ringmap[locDOCABin][ringNum];
656 japp->RootFillLock(
this);
658 Double_t w = locHistToFill->GetBinContent(wireNum, 1) + 1.0;
659 locHistToFill->SetBinContent(wireNum, 1, w);
661 japp->RootFillUnLock(
this);
663 if (FILL_DEDX_HISTOS) {
666 TH2D* locHistToFill = cdc_measured_with_dedx_ringmap[locDOCABin][ringNum];
667 japp->RootFillLock(
this);
669 Double_t w = locHistToFill->GetBinContent(wireNum, 1) + 1.0;
670 locHistToFill->SetBinContent(wireNum, 1, w);
672 japp->RootFillUnLock(
this);
683 if (distanceToWire < DOCACUT)
685 japp->RootFillLock(
this);
687 Double_t w = cdc_expected_ring[ringNum]->GetBinContent(wireNum, 1) + 1.0;
688 cdc_expected_ring[ringNum]->SetBinContent(wireNum, 1, w);
690 japp->RootFillUnLock(
this);
693 int locDOCABin = (int) (distanceToWire * 10) % 8;
694 TH2D* locHistToFill = cdc_expected_ringmap[locDOCABin][ringNum];
695 japp->RootFillLock(
this);
697 Double_t w = locHistToFill->GetBinContent(wireNum, 1) + 1.0;
698 locHistToFill->SetBinContent(wireNum, 1, w);
700 japp->RootFillUnLock(
this);
705 if(!locSortedCDCTrackHits[locProjectedStraw].empty())
706 return *(locSortedCDCTrackHits[locProjectedStraw].begin());
708 int locNumStraws = cdcwires[locRing - 1].size();
711 int locSearchStraw = locProjectedStraw - 1;
712 if(locSearchStraw <= 0)
713 locSearchStraw += locNumStraws;
714 if(!locSortedCDCTrackHits[locSearchStraw].empty())
715 return *(locSortedCDCTrackHits[locProjectedStraw].begin());
718 locSearchStraw = locProjectedStraw + 1;
719 if(locSearchStraw > locNumStraws)
720 locSearchStraw -= locNumStraws;
721 if(!locSortedCDCTrackHits[locSearchStraw].empty())
722 return *(locSortedCDCTrackHits[locProjectedStraw].begin());
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));
738 POCAOnTrack = trackPosition + sc * trackMomentum;
739 POCAOnWire = wirePosition + tc * wireDirection;
740 DVector3 LOCA = w0 + sc*trackMomentum - tc*wireDirection;
static TH1I * hChi2OverNDF
void Get_CDCRings(unsigned int locBitPattern, set< int > &locCDCRings) const
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.
jerror_t erun(void)
Called everytime run number changes, provided brun has been called.
sprintf(text,"Post KinFit Cut")
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
jerror_t fini(void)
Called after last event of last event source has been processed.
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.
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)
DGeometry * GetDGeometry(unsigned int run_number)
static TH2I * hResVsT[25]
JEventProcessor_CDC_Efficiency()
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
void Fill_ExpectedHit(int ringNum, int wireNum, double distanceToWire)
jerror_t init(void)
Called once at program start.
const DTrackFitter * fitter
jerror_t evnt(jana::JEventLoop *eventLoop, uint64_t eventnumber)
Called every event.
map< DetectorSystem_t, vector< DTrackFitter::Extrapolation_t > > extrapolations
bool GetTargetZ(double &z_target) const
z-location of center of target
bool Get_IsMatchedToDetector(const DTrackingData *locTrack, DetectorSystem_t locDetectorSystem) const
~JEventProcessor_CDC_Efficiency()
int main(int argc, char *argv[])
double DistToWire(const DCoordinateSystem *wire, const vector< Extrapolation_t > &extrapolations, DVector3 *pos=NULL, DVector3 *mom=NULL, DVector3 *position_along_wire=NULL) const