11 #include "cdc/modules/cdcCRTest/CDCCRTestModule.h"
13 #include <framework/gearbox/Const.h>
14 #include <framework/core/HistoModule.h>
15 #include <framework/datastore/StoreObjPtr.h>
16 #include <framework/datastore/StoreArray.h>
17 #include <framework/datastore/RelationArray.h>
19 #include <mdst/dataobjects/TrackFitResult.h>
20 #include <mdst/dataobjects/Track.h>
21 #include <tracking/dataobjects/RecoTrack.h>
22 #include <genfit/TrackPoint.h>
23 #include <genfit/KalmanFitterInfo.h>
24 #include <genfit/MeasurementOnPlane.h>
25 #include <genfit/MeasuredStateOnPlane.h>
26 #include <genfit/StateOnPlane.h>
27 #include <boost/foreach.hpp>
29 #include <cdc/translators/RealisticCDCGeometryTranslator.h>
30 #include <cdc/translators/RealisticTDCCountTranslator.h>
31 #include <cdc/dataobjects/CDCRecoHit.h>
32 #include <cdc/dataobjects/CDCSimHit.h>
33 #include "TDirectory.h"
34 #include <Math/ProbFuncMathCore.h>
48 setDescription(
"CDC Cosmic ray test module");
49 setPropertyFlags(c_ParallelProcessingCertified);
50 addParam(
"CorrectToF", m_ToF,
"if true, time of flight will take account in t",
true);
51 addParam(
"CorrectToP", m_ToP,
"if true, time of Propagation will take account in t",
true);
52 addParam(
"RecoTracksColName", m_recoTrackArrayName,
"Name of collection hold genfit::Track", std::string(
""));
53 addParam(
"histogramDirectoryName", m_histogramDirectoryName,
54 "Track fit results histograms will be put into this directory", std::string(
"trackfit"));
55 addParam(
"NameOfTree", m_treeName,
"name of tree in output file",
string(
"tree"));
56 addParam(
"fillExpertHistograms", m_fillExpertHistos,
"Fill additional histograms",
true);
57 addParam(
"noBFit", m_noBFit,
"If true -> #Params ==4, #params ==5 for calculate P-Val",
false);
58 addParam(
"plotResidual", m_plotResidual,
"plot biased residual, normalized res and xtplot for all layer",
false);
59 addParam(
"calExpectedDriftTime", m_calExpectedDriftTime,
"if true module will calculate expected drift time, it take a time",
61 addParam(
"hitEfficiency", m_hitEfficiency,
"calculate hit efficiency(Not work now) true:yes false:No",
false);
62 addParam(
"TriggerPos", m_TriggerPos,
"Trigger position use for cut and reconstruct Trigger image", std::vector<double> { -0.6, -13.25, 17.3});
63 addParam(
"NormTriggerPlaneDirection", m_TriggerPlaneDirection,
"Normal trigger plane direction and reconstruct Trigger image",
64 std::vector<double> { 0, 1, 0});
65 addParam(
"TriggerSize", m_TriggerSize,
"Trigger Size, (Width x length)", std::vector<double> {100, 50});
66 addParam(
"IwireLow", m_low,
"Lower boundary of hit dist. Histogram", std::vector<int> {0, 0, 0, 0, 0, 0, 0, 0, 0});
67 addParam(
"IwireUpper", m_up,
"Upper boundary of hit dist. Histogram", std::vector<int> {161, 161, 193, 225, 257, 289, 321, 355, 385});
68 addParam(
"StoreCDCSimHitInfo", m_StoreCDCSimHitInfo,
"Store simulation info related to hit, driftLeng, flight time,z_onwire",
70 addParam(
"EstimateResultForUnFittedLayer", m_EstimateResultForUnFittedLayer,
71 "Calculate residual for Layer that is set unUseInFit",
true);
72 addParam(
"SmallerOutput", m_SmallerOutput,
"If true, trigghit position, residual cov,absRes, will not be stored",
false);
73 addParam(
"StoreTrackParams", m_StoreTrackParams,
"Store Track Parameter or not, it will be multicount for each hit",
true);
74 addParam(
"StoreHitDistribution", m_MakeHitDist,
"Make hit distribution or not",
true);
75 addParam(
"EventT0Extraction", m_EventT0Extraction,
"use event t0 extract t0 or not",
true);
76 addParam(
"MinimumPt", m_MinimumPt,
"Tracks with tranverse momentum small than this will not recored", 0.);
79 CDCCRTestModule::~CDCCRTestModule()
86 void CDCCRTestModule::defineHisto()
88 m_tree =
new TTree(m_treeName.c_str(),
"tree");
89 m_tree->Branch(
"x_mea", &x_mea,
"x_mea/D");
90 m_tree->Branch(
"x_u", &x_u,
"x_u/D");
91 m_tree->Branch(
"x_b", &x_b,
"x_b/D");
92 m_tree->Branch(
"z", &z,
"z/D");
93 m_tree->Branch(
"alpha", &alpha,
"alpha/D");
94 m_tree->Branch(
"theta", &theta,
"theta/D");
95 m_tree->Branch(
"t", &t,
"t/D");
96 m_tree->Branch(
"evtT0", &evtT0,
"evtT0/D");
97 m_tree->Branch(
"adc", &adc,
"adc/s");
98 m_tree->Branch(
"boardID", &boardID,
"boardID/I");
99 m_tree->Branch(
"lay", &lay,
"lay/I");
100 m_tree->Branch(
"weight", &weight,
"weight/D");
101 m_tree->Branch(
"IWire", &IWire,
"IWire/I");
102 m_tree->Branch(
"Pval", &Pval,
"Pval/D");
103 m_tree->Branch(
"ndf", &ndf,
"ndf/D");
105 if (m_StoreTrackParams) {
106 m_tree->Branch(
"d0", &d0,
"d0/D");
107 m_tree->Branch(
"z0", &z0,
"z0/D");
108 m_tree->Branch(
"phi0", &phi0,
"phi0/D");
109 m_tree->Branch(
"tanL", &tanL,
"tanL/D");
110 m_tree->Branch(
"omega", &omega,
"omega/D");
111 m_tree->Branch(
"Pt", &Pt,
"Pt/D");
113 if (m_StoreCDCSimHitInfo) {
114 m_tree->Branch(
"z_sim", &z_sim,
"z_sim/D");
115 m_tree->Branch(
"x_sim", &x_sim,
"x_sim/D");
116 m_tree->Branch(
"dt_flight_sim", &dt_flight_sim,
"dt_flight_sim/D");
118 if (m_calExpectedDriftTime) {
119 m_tree->Branch(
"t_fit", &t_fit,
"t_fit/D");
121 if (!m_SmallerOutput) {
122 m_tree->Branch(
"tdc", &tdc,
"tdc/I");
123 m_tree->Branch(
"z_prop", &z_prop,
"z_prop/D");
124 m_tree->Branch(
"res_b", &res_b,
"res_b/D");
125 m_tree->Branch(
"res_u", &res_u,
"res_u/D");
126 m_tree->Branch(
"lr", &lr,
"lr/I");
127 m_tree->Branch(
"trigHitPos_x", &trigHitPos_x,
"trigHitPos_x/D");
128 m_tree->Branch(
"trigHitPos_z", &trigHitPos_z,
"trigHitPos_z/D");
129 m_tree->Branch(
"numhits", &numhits,
"numhits/I");
130 m_tree->Branch(
"res_b_err", &res_b_err,
"res_b_err/D");
131 m_tree->Branch(
"res_u_err", &res_u_err,
"res_u_err/D");
132 m_tree->Branch(
"absRes_u", &absRes_u,
"absRes_u/D");
133 m_tree->Branch(
"absRes_b", &absRes_b,
"absRes_b/D");
134 m_tree->Branch(
"dt_prop", &dt_prop,
"dt_prop/D");
135 m_tree->Branch(
"dt_flight", &dt_flight,
"dt_flight/D");
139 TDirectory* oldDir = gDirectory;
140 TDirectory* histDir = oldDir->mkdir(m_histogramDirectoryName.c_str());
142 m_hNTracks = getHist(
"hNTracks",
"number of tracks", 3, 0, 3);
143 m_hNTracks->GetXaxis()->SetBinLabel(1,
"fitted, converged");
144 m_hNTracks->GetXaxis()->SetBinLabel(2,
"fitted, not converged");
145 m_hNTracks->GetXaxis()->SetBinLabel(3,
"TrackCand, but no Track");
147 m_hNDF = getHist(
"hNDF",
"NDF of fitted track;NDF;Tracks", 71, -1, 150);
148 m_hNHits = getHist(
"hNHits",
"#hit of fitted track;#hit;Tracks", 61, -1, 150);
149 m_hNHits_trackcand = getHist(
"hNHits_trackcand",
"#hit of track candidate;#hit;Tracks", 71, -1, 150);
150 m_hNTracksPerEvent = getHist(
"hNTracksPerEvent",
"#tracks/Event;#Tracks;Event", 20, 0, 20);
151 m_hNTracksPerEventFitted = getHist(
"hNTracksPerEventFitted",
"#tracks/Event After Fit;#Tracks;Event", 20, 0, 20);
152 m_hChi2 = getHist(
"hChi2",
"#chi^{2} of tracks;#chi^{2};Tracks", 400, 0, 400);
153 m_hPhi0 = getHist(
"hPhi0",
"#Phi_{0} of tracks;#phi_{0} (Degree);Tracks", 400, -190, 190);
154 m_hAlpha = getHist(
"hAlpha",
"#alpha Dist.;#alpha (Degree);Hits", 360, -90, 90);
155 m_hTheta = getHist(
"hTheta",
"#theta Dist.;#theta (Degree);Hits", 360, 0, 180);
156 m_hPval = getHist(
"hPval",
"p-values of tracks;pVal;Tracks", 1000, 0, 1);
157 m_hEvtT0 = getHist(
"hEvtT0",
"Event T0; EvtT0 (ns); #event", 200, -100, 100);
159 m_hTriggerHitZX = getHist(
"TriggerHitZX",
"Hit Position on trigger counter;z(cm);x(cm)", 300, -100, 100, 120, -15, 15);
161 m_h2DHitDistInCDCHit = getHist(
"2DHitDistInCDCHit",
" CDCHit;WireID;LayerID",
162 m_up[8] - m_low[0], m_low[0], m_up[8], 56, 0, 56);
163 m_h2DHitDistInTrCand = getHist(
"2DHitDistInTrCand",
"Track Cand ;WireID;LayerID",
164 m_up[8] - m_low[0], m_low[0], m_up[8], 56, 0, 56);
165 m_h2DHitDistInTrack = getHist(
"2DHitDistInTrack",
"Fitted Track ;WireID;LayerID",
166 m_up[8] - m_low[0], m_low[0], m_up[8], 56, 0, 56);
168 if (m_fillExpertHistos) {
169 m_hNDFChi2 = getHist(
"hNDFChi2",
"#chi^{2} of tracks;NDF;#chi^{2};Tracks", 8, 0, 8, 800, 0, 200);
170 m_hNDFPval = getHist(
"hNDFPval",
"p-values of tracks;NDF;pVal;Tracks", 8, 0, 8, 100, 0, 1);
173 for (
int i = 0; i < 56; ++i) {
174 if (m_hitEfficiency) {
175 m_hHitEff_soft[i] = getHistProfile(Form(
"hHitEff_soft_L%d", i),
176 Form(
"hit efficiency(soft) of Layer %d ;Drift distance;Software Efficiency", i), 200, -1, 1);
179 if (i < 8) {sl = 0;}
else { sl = floor((i - 8) / 6) + 1;}
180 m_hHitDistInCDCHit[i] = getHist(Form(
"hHitDistInCDCHit_layer%d", i), Form(
"Hit Dist. ICLayer_%d;WireID;#Hits", i),
181 m_up.at(sl) - m_low.at(sl), m_low.at(sl), m_up.at(sl));
182 m_hHitDistInCDCHit[i]->SetLineColor(kGreen);
183 m_hHitDistInTrCand[i] = getHist(Form(
"hHitDistInTrCand_layer%d", i), Form(
"Hit Dist. ICLayer_%d;WireID;#Hits", i),
184 m_up.at(sl) - m_low.at(sl), m_low.at(sl), m_up.at(sl));
185 m_hHitDistInTrCand[i]->SetLineColor(kRed);
186 m_hHitDistInTrack[i] = getHist(Form(
"hHitDistInTrack_layer%d", i), Form(
"Hit Dist. ICLayer_%d;WireID;#Hits", i),
187 m_up.at(sl) - m_low.at(sl), m_low.at(sl), m_up.at(sl));
189 const double normResRange = 20;
190 const double residualRange = 0.3;
191 std::string title, name;
192 if (m_plotResidual) {
193 name = (boost::format(
"hist_ResidualsU%1%") % i).str();
194 title = (boost::format(
"unnormalized, unbiased residuals in layer %1%;cm;Tracks") % i).str();
195 m_hResidualU[i] = getHist(name, title, 500, -residualRange, residualRange);
197 name = (boost::format(
"hNormalizedResidualsU%1%") % i).str();
198 title = (boost::format(
"normalized, unbiased residuals in layer %1%;NDF;#sigma (cm);Tracks") % i).str();
199 m_hNormalizedResidualU[i] = getHist(name, title, 500, -normResRange, normResRange);
201 name = (boost::format(
"DxDt%1%") % i).str();
202 title = (boost::format(
"Drift Length vs Drift time at Layer_%1%;Drift Length (cm);Drift time (ns)") % i).str();
203 m_hDxDt[i] = getHist(name, title, 200, -1, 1, 450, -50, 400);
205 if (m_fillExpertHistos) {
206 name = (boost::format(
"hNDFResidualsU%1%") % i).str();
207 title = (boost::format(
"unnormalized, unbiased residuals along U in layer %1%;NDF;cm;Tracks") % i).str();
208 m_hNDFResidualU[i] = getHist(name, title, 8, 0, 8, 1000, -residualRange, residualRange);
210 name = (boost::format(
"hNDFNormalizedResidualsU%1%") % i).str();
211 title = (boost::format(
"normalized, unbiased residuals in layer %1%;NDF;#sigma (cm);Tracks") % i).str();
212 m_hNDFNormalizedResidualU[i] = getHist(name, title, 8, 0, 8, 1000, -normResRange, normResRange);
218 void CDCCRTestModule::initialize()
225 RelationArray relRecoTrackTrack(recoTracks, storeTrack, m_relRecoTrackTrackName);
227 m_recoTrackArrayName = recoTracks.getName();
228 m_trackFitResultArrayName = storeTrackFitResults.getName();
229 m_relRecoTrackTrackName = relRecoTrackTrack.
getName();
231 for (
size_t i = 0; i < m_allHistos.size(); ++i) {
232 m_allHistos[i]->Reset();
234 B2ASSERT(
"Trigger Position (TriggerPos) must be 3 components.", m_TriggerPos.size() == 3);
235 B2ASSERT(
"Normal vector of Trigger Plane (NormTriggerPlaneDirection) must be 3 components.", m_TriggerPlaneDirection.size() == 3);
236 B2ASSERT(
"Trigger size (TriggerSize) must be 2 component width and length(z direction)", m_TriggerSize.size() == 2);
237 B2ASSERT(
"List of Lower boundary (IWireLow) ( for histo must be 9 components, equivalent 9 supper layers", m_low.size() == 9);
238 B2ASSERT(
"List of Upper boundary (IWireUp) for histo must be 9 components, equivalent 9 supper layers", m_low.size() == 9);
239 B2INFO(
"Trigger Position (" << m_TriggerPos.at(0) <<
" ," << m_TriggerPos.at(1) <<
" ," << m_TriggerPos.at(2) <<
")");
242 void CDCCRTestModule::beginRun()
246 void CDCCRTestModule::event()
253 const RelationArray relTrackTrack(recoTracks, storeTrack, m_relRecoTrackTrackName);
257 for (
int i = 0; i < cdcHits.
getEntries(); ++i) {
259 m_hHitDistInCDCHit[getICLayer(hit->getISuperLayer(), hit->getILayer())]->Fill(hit->getIWire());
260 m_h2DHitDistInCDCHit->Fill(hit->getIWire(), getICLayer(hit->getISuperLayer(), hit->getILayer()));
265 m_hNTracksPerEvent->Fill(nTr);
269 for (
int i = 0; i < nTr; ++i) {
271 if (track->getDirtyFlag()) {B2INFO(
"Dirty flag was set for track: " << track->getPositionSeed().Y());
continue;}
272 m_hNHits_trackcand->Fill(track->getNumberOfCDCHits());
274 getHitDistInTrackCand(track);
276 if (!track->hasTrackFitStatus()) {
277 m_hNTracks->Fill(
"Track not fitted", 1.0);
280 if (!track->getTrackFitStatus()->isFitted()) {
281 m_hNTracks->Fill(
"Track not fitted", 1.0);
286 m_hNTracks->Fill(
"fitted, not converged", 1.0);
287 B2DEBUG(99,
"------Fitted but not converged");
291 m_hNTracks->Fill(
"fitted, converged", 1.0);
292 B2DEBUG(99,
"-------Fittted and Conveged");
294 nfitted = nfitted + 1;
297 if (!b2track) {B2DEBUG(99,
"No relation found");
continue;}
301 B2WARNING(
"track was fitted but Relation not found");
305 if (m_noBFit) {ndf = fs->
getNdf() + 1;}
306 else {ndf = fs->
getNdf();}
308 TrPval = std::max(0., ROOT::Math::chisquared_cdf_c(Chi2, ndf));
309 m_hPval->Fill(TrPval);
311 if (ndf < 15)
continue;
312 if (m_EventT0Extraction) {
314 if (m_eventTimeStoreObject.isValid() && m_eventTimeStoreObject->hasEventT0()) {
315 evtT0 = m_eventTimeStoreObject->getEventT0();
316 m_hEvtT0->Fill(evtT0);
320 d0 = fitresult->getD0();
321 z0 = fitresult->getZ0();
322 tanL = fitresult->getTanLambda();
323 omega = fitresult->getOmega();
324 phi0 = fitresult->getPhi0() * 180 / M_PI;
325 Pt = fitresult->getMomentum().Perp();
328 if (Pt < m_MinimumPt)
continue;
329 if (m_hitEfficiency && track->getNumberOfCDCHits() > 30 && TrPval > 0.001) {
330 HitEfficiency(track);
332 if (m_fillExpertHistos) {
333 m_hNDFChi2->Fill(ndf, fs->
getChi2());
334 m_hNDFPval->Fill(ndf, TrPval);
340 B2ERROR(
"Exception when calling the plotResults method" << e.what());
343 if (m_EstimateResultForUnFittedLayer) {
346 getResidualOfUnFittedLayer(track);
355 m_hNTracksPerEventFitted->Fill(nfitted);
358 void CDCCRTestModule::endRun()
362 void CDCCRTestModule::terminate()
368 m_trigHitPos = getTriggerHitPosition(track);
369 trigHitPos_x = m_trigHitPos.X();
370 trigHitPos_z = m_trigHitPos.Z();
371 m_hTriggerHitZX->Fill(m_trigHitPos.Z(), m_trigHitPos.X());
372 bool hittrig = (sqrt((m_trigHitPos.X() - m_TriggerPos[0]) * (m_trigHitPos.X() - m_TriggerPos[0]) +
373 (m_trigHitPos.Y() - m_TriggerPos[1]) * (m_trigHitPos.Y() - m_TriggerPos[1])) < m_TriggerSize[0] / 2
374 && fabs(m_trigHitPos.Z() - m_TriggerPos[2]) < m_TriggerSize[1] / 2) ?
true :
false;
375 if (hittrig) {trighit = 1;}
379 m_hNHits->Fill(track->getNumberOfCDCHits());
381 std::vector<genfit::TrackPoint*> tps = track->getHitPointsWithMeasurement();
382 numhits = tps.size();
384 if (!tp->hasRawMeasurements())
392 if (!kfi) {B2DEBUG(199,
"No Fitter Info: Layer " << wireid.getICLayer());
continue;}
394 for (
unsigned int iMeas = 0; iMeas < kfi->getNumMeasurements(); ++iMeas) {
398 lay = wireid.getICLayer();
399 IWire = wireid.getIWire();
401 m_hHitDistInTrack[lay]->Fill(IWire);
402 m_h2DHitDistInTrack->Fill(IWire, lay);
410 const TVector3 pocaOnWire = mop.getPlane()->getO();
411 const TVector3 pocaOnTrack = mop.getPlane()->getU();
412 const TVector3 pocaMom = mop.getMom();
413 alpha = cdcgeo.
getAlpha(pocaOnWire, pocaMom) ;
416 x_mea = kfi->getMeasurementOnPlane(iMeas)->getState()(0);
418 res_b = residual_b.getState()(0);
420 res_u = residual_u.getState()(0);
423 if (fabs(alpha) > M_PI / 2) {
429 x_mea = copysign(x_mea, x_u);
433 B2DEBUG(199,
"x_unbiased " << x_u <<
" |left_right " << lr);
434 if (m_calExpectedDriftTime) { t_fit = cdcgeo.
getDriftTime(std::abs(x_u), lay, lr, alpha , theta);}
437 m_hAlpha->Fill(alpha);
438 m_hTheta->Fill(theta);
442 absRes_b = std::abs(x_b + res_b) - std::abs(x_b);
443 absRes_u = std::abs(x_u + res_u) - std::abs(x_u);
444 weight = residual_u.getWeight();
445 res_b_err = std::sqrt(residual_b.getCov()(0, 0));
446 res_u_err = std::sqrt(residual_u.getCov()(0, 0));
448 t = tdcTrans->
getDriftTime(tdc, wireid, mop.getTime(), pocaOnWire.Z(), adc);
452 if (m_StoreCDCSimHitInfo) {
461 if (m_plotResidual) {
462 m_hDxDt[lay]->Fill(x_u, t);
463 m_hResidualU[lay]->Fill(res_b, weight);
464 m_hNormalizedResidualU[lay]->Fill(res_b / sqrt(residual_b.getCov()(0, 0)), weight);
466 if (m_fillExpertHistos) {
467 m_hNDFResidualU[lay]->Fill(ndf, res_b, weight);
468 m_hNDFResidualU[lay]->Fill(ndf, res_b);
469 m_hNDFNormalizedResidualU[lay]->Fill(ndf, res_b / std::sqrt(residual_b.getCov()(0, 0)), weight);
478 void CDCCRTestModule::getHitDistInTrackCand(
const RecoTrack* track)
482 B2DEBUG(99,
"In TrackCand: ICLayer: " << iclay <<
"IWire: " << cdchit->
getIWire());
483 m_hHitDistInTrCand[iclay]->Fill(cdchit->
getIWire());
484 m_h2DHitDistInTrCand->Fill(cdchit->
getIWire(), iclay);
488 TVector3 CDCCRTestModule::getTriggerHitPosition(
RecoTrack* track)
490 TVector3 trigpos(m_TriggerPos.at(0), m_TriggerPos.at(1), m_TriggerPos.at(2));
491 TVector3 trigDir(m_TriggerPlaneDirection.at(0), m_TriggerPlaneDirection.at(1), m_TriggerPlaneDirection.at(2));
494 TVector3 pos(-200, 200, 200);
497 if (fabs(l) < 1000) pos = mop.getPos();
499 B2WARNING(
"extrapolate to Trigger counter failure" << er.
what());
517 const genfit::TrackPoint* tp = track->getCreatedTrackPoint(track->getRecoHitInformation(cdchit));
521 if (rightLeftHitInformation == RecoHitInformation::RightLeftInformation::c_left) {
523 }
else if (rightLeftHitInformation == RecoHitInformation::RightLeftInformation::c_right) {
527 if (!tp->hasRawMeasurements())
534 unsigned short imea = 0;
535 for (
unsigned int iMeas = 0; iMeas < kfi->getNumMeasurements(); ++iMeas) {
537 if (ww > max) {max = ww; imea = iMeas;}
539 double xx = kfi->getMeasurementOnPlane(imea)->getState()(0);
540 m_hHitEff_soft[Wid.
getICLayer()]->Fill(std::copysign(xx, RLInfo), max);
547 B2INFO(
"Start estimate residual for un-fitted layer");
548 B2INFO(
"position seed" << track->getPositionSeed().Y());
552 x_b = 0; res_b = 0; res_b_err = 0;
553 x_u = 0; res_u = 0; res_u_err = 0;
554 z = 0; dt_flight_sim = 0; z_prop = 0; t = 0;
555 dt_prop = 0; dt_flight = 0; alpha = 0; theta = 0;
556 tdc = 0; adc = 0; lay = 0; IWire = 0;
559 B2INFO(
"number of cdchit" << track->getCDCHitList().size());
560 B2INFO(
"number of point use int fit" << ndf + 4);
562 typedef std::pair<double, const RecoHitInformation*> SortingRecoHitPair;
566 if (track->getRecoHitInformation(cdchit)->useInFit())
continue;
570 int hitSortingParameter = track->getRecoHitInformation(cdchit)->getSortingParameter();
572 SortingRecoHitPair frontSideHit = std::make_pair(0,
nullptr);;
573 SortingRecoHitPair backsideSideHit = std::make_pair(0,
nullptr);;
574 SortingRecoHitPair hit4extraction;
587 auto hitListReverse = track->getCDCHitList();
588 std::reverse(hitListReverse.begin() , hitListReverse.end());
597 B2DEBUG(99,
"forward sorting parameter: " << frontSideHit.first <<
" |backward sorting parameter = " << backsideSideHit.first);
598 if (std::fabs(frontSideHit.first - hitSortingParameter) < std::fabs(backsideSideHit.first - hitSortingParameter)) {
599 hit4extraction = frontSideHit;
601 hit4extraction = backsideSideHit;
605 if (hit4extraction.second ==
nullptr)
608 auto closestHitTrackPoint = track->getCreatedTrackPoint(hit4extraction.second);
620 plane = constructPlane(meaOnPlane, wireid);
622 B2WARNING(
"Error happen, can not reconstruct plan for extrapolating" << e.what());
625 double segmentLength;
627 segmentLength = meaOnPlane.extrapolateToPlane(plane);
629 B2WARNING(
"Could not extrapolate the fit" << e.what());
632 IWire = wireid.getIWire();
633 lay = wireid.getICLayer();
634 const TVector3 pocaOnWire = meaOnPlane.getPlane()->getO();
635 const TVector3 pocaMom = meaOnPlane.getMom();
636 x_u = meaOnPlane.getState()(3);
637 alpha = cdcgeo.
getAlpha(pocaOnWire, pocaMom) ;
641 dt_prop = z_prop / 27.25;
645 if (fabs(alpha) > M_PI / 2) {
651 dt_flight = meaOnPlane.getTime();
652 x_mea = tdcTrans->
getDriftLength(cdchit->getTDCCount(), wireid, dt_flight, lr, pocaOnWire.Z(), alpha, theta, cdchit->getADCCount());
653 x_mea = std::copysign(x_mea, x_u);
655 absRes_u = fabs(x_mea) - fabs(x_u);
658 m_hAlpha->Fill(alpha);
659 m_hTheta->Fill(theta);
660 if (m_StoreCDCSimHitInfo) {
668 B2DEBUG(199,
"we calculate residua for lay - IWire: " << lay <<
" - " << IWire);
669 B2DEBUG(199,
"distance between two hit" << segmentLength);
670 B2DEBUG(199,
"Flight Time (extra | sim)" << dt_flight <<
" - " << dt_flight_sim);
671 B2DEBUG(199,
"DriftLength (cal | sim)" << x_mea <<
" - " << x_sim);
690 TVector3 WireDirectionIdeal = Wire2PosIdeal - Wire1PosIdeal;
691 WireDirectionIdeal.SetMag(1.);
696 const TVector3& PocaIdeal = rep->
getPos(st);
698 double zPOCA = (Wire1PosIdeal.Z()
699 + WireDirectionIdeal.Dot(PocaIdeal - Wire1PosIdeal) * WireDirectionIdeal.Z());
706 TVector3 wireDirection = wire2 - wire1;
707 wireDirection.SetMag(1.);
711 const TVector3& poca = rep->
getPos(st);
712 TVector3 dirInPoca = rep->
getMom(st);
713 dirInPoca.SetMag(1.);
714 const TVector3& pocaOnWire = wire1 + wireDirection.Dot(poca - wire1) * wireDirection;
715 if (fabs(wireDirection.Angle(dirInPoca)) < 0.01) {
716 B2WARNING(
"cannot construct det plane, track parallel with wire");
719 const TVector3& U = wireDirection.Cross(dirInPoca);