14 #define TRG_SHORT_NAMES
15 #define TRGCDC_SHORT_NAMES
18 #include "trg/trg/Debug.h"
19 #include "trg/cdc/Fitter3D.h"
20 #include "trg/cdc/Segment.h"
21 #include "trg/cdc/Track.h"
22 #include "trg/cdc/Link.h"
25 #include <framework/dataobjects/EventMetaData.h>
26 #include "cdc/dataobjects/CDCSimHit.h"
27 #include "cdc/geometry/CDCGeometryPar.h"
28 #include "trg/trg/Time.h"
29 #include "trg/trg/Signal.h"
30 #include "trg/trg/Utilities.h"
31 #include "trg/cdc/TRGCDC.h"
32 #include "trg/cdc/Wire.h"
33 #include "trg/cdc/Layer.h"
34 #include "trg/cdc/WireHit.h"
35 #include "trg/cdc/WireHitMC.h"
36 #include "trg/cdc/SegmentHit.h"
37 #include "trg/cdc/TrackMC.h"
38 #include "trg/cdc/Relation.h"
39 #include "mdst/dataobjects/MCParticle.h"
40 #include "trg/cdc/FrontEnd.h"
41 #include "trg/cdc/Merger.h"
42 #include "trg/cdc/LUT.h"
43 #include "trg/trg/Constants.h"
44 #include "trg/cdc/Helix.h"
45 #include "trg/cdc/Fitter3DUtility.h"
46 #include "trg/cdc/EventTime.h"
47 #include "trg/cdc/JSignal.h"
48 #include "trg/cdc/JLUT.h"
49 #include "trg/cdc/JSignalData.h"
50 #include "trg/cdc/FpgaUtility.h"
51 #include "trg/cdc/HandleRoot.h"
60 TRGCDCFitter3D::TRGCDCFitter3D(
const std::string& name,
61 const std::string& rootFitter3DFile,
63 const std::map<std::string, bool>& flags)
64 : m_name(name), m_cdc(
TRGCDC),
65 m_mBool(flags), m_rootFitter3DFileName(rootFitter3DFile),
66 m_treeTrackFitter3D(), m_treeConstantsFitter3D()
80 evtMetaData.isRequired();
86 m_mBool[
"fIsIntegerEffect"] = 1;
98 for (
unsigned iSL = 0; iSL < 9; iSL++) {
104 m_mConstV[
"nTSs2D"] = vector<double> (5);
105 for (
unsigned iAx = 0; iAx < 5; iAx++) {
109 m_mConstV[
"zToStraw"] = vector<double> (4);
110 m_mConstV[
"zToOppositeStraw"] = vector<double> (4);
111 m_mConstV[
"angleSt"] = vector<double> (4);
112 m_mConstV[
"nShift"] = vector<double> (4);
113 for (
int iSt = 0; iSt < 4; iSt++) {
125 for (
int iSt = 0; iSt < 4; iSt++)
m_mConstV[
"rr3D"][iSt] =
m_mConstV[
"rr"][iSt * 2 + 1];
127 m_mConstV[
"wirePhi2DError"] = vector<double> (5);
128 m_mConstV[
"driftPhi2DError"] = vector<double> (5);
142 m_mConstV[
"wirePhi2DError"][0] = 0.00085106;
143 m_mConstV[
"wirePhi2DError"][1] = 0.00039841;
144 m_mConstV[
"wirePhi2DError"][2] = 0.00025806;
145 m_mConstV[
"wirePhi2DError"][3] = 0.00019084;
146 m_mConstV[
"wirePhi2DError"][4] = 0.0001514;
147 m_mConstV[
"driftPhi2DError"][0] = 0.00085106;
148 m_mConstV[
"driftPhi2DError"][1] = 0.00039841;
149 m_mConstV[
"driftPhi2DError"][2] = 0.00025806;
150 m_mConstV[
"driftPhi2DError"][3] = 0.00019084;
151 m_mConstV[
"driftPhi2DError"][4] = 0.0001514;
156 m_mConstV[
"driftZError"] = vector<double> ({0.7676, 0.9753, 1.029, 1.372});
157 m_mConstV[
"wireZError"] = vector<double> ({0.7676, 0.9753, 1.029, 1.372});
161 for (
unsigned iSl = 0; iSl < 9; iSl++) {
162 string tableName =
"driftLengthTableSL" + to_string(iSl);
163 unsigned tableSize = 512;
164 m_mConstV[tableName] = vector<double> (tableSize);
166 for (
unsigned iTick = 0; iTick < tableSize; iTick++) {
168 double avgDriftLength = 0;
169 if (
m_mBool[
"fXtSimple"] == 1) {
172 double driftLength_0 = cdcp.
getDriftLength(t_driftTime, t_layer, 0);
173 double driftLength_1 = cdcp.
getDriftLength(t_driftTime, t_layer, 1);
174 avgDriftLength = (driftLength_0 + driftLength_1) / 2;
176 m_mConstV[tableName][iTick] = avgDriftLength;
181 cout <<
"fLRLUT: " <<
m_mBool[
"fLRLUT"] << endl;
182 cout <<
"fMc: " <<
m_mBool[
"fMc"] << endl;
183 cout <<
"fVerbose: " <<
m_mBool[
"fVerbose"] << endl;
184 if (
m_mBool[
"fMc"]) cout <<
"fmcLR: " <<
m_mBool[
"fmcLR"] << endl;
185 cout <<
"fRoot: " <<
m_mBool[
"fRootFile"] << endl;
186 cout <<
"PI: " <<
m_mConstD[
"Trg_PI"] << endl;
190 cout <<
"nWires: " << int(
m_mConstV[
"nWires"][0]) <<
" " << int(
m_mConstV[
"nWires"][1]) <<
" " << int(
199 " " <<
m_mConstV[
"wireZError"][3] << endl;
201 <<
" " <<
m_mConstV[
"driftZError"][3] << endl;
202 cout <<
"wirePhiError: " <<
m_mConstV[
"wirePhi2DError"][0] <<
" " <<
m_mConstV[
"wirePhi2DError"][1] <<
" " <<
204 cout <<
"driftPhiError: " <<
m_mConstV[
"driftPhi2DError"][0] <<
" " <<
m_mConstV[
"driftPhi2DError"][1] <<
" " <<
226 m_mDouble[
"eventNumber"] = eventMetaDataPtr->getEvent();
230 for (
unsigned iTrack = 0; iTrack < trackList.size(); iTrack++) {
232 TCTrack& aTrack = * trackList[iTrack];
238 m_mDouble[
"trackId"] = aTrack.getTrackID();
243 if (fit2DResult != 0) {
245 if (
m_mBool[
"fVerbose"]) cout <<
"Exit due to 2D fit result:" << fit2DResult << endl;
253 for (
unsigned iSt = 0; iSt < 4; iSt++) {
254 const vector<TCLink*>& links = aTrack.links(iSt * 2 + 1);
255 const unsigned nSegments = links.size();
256 cout <<
"iSt:" << iSt <<
" nSegments:" << nSegments << endl;
257 for (
unsigned iTS = 0; iTS < nSegments; iTS++) {
258 const TCSegment* t_segment =
dynamic_cast<const TCSegment*
>(& links[iTS]->hit()->cell());
259 cout <<
" tsId:" << t_segment->localId()
260 <<
" tdc:" << t_segment->priorityTime() <<
" lr:" << t_segment->LUT()->getValue(t_segment->lutPattern())
261 <<
" priorityPosition:" << t_segment->priorityPosition() << endl;
266 m_mVector[
"useStSl"] = vector<double> (4);
272 for (
unsigned iAx = 0; iAx < 5; iAx++)
m_mVector[
"useSl"][2 * iAx] =
m_mVector[
"useAxSl"][iAx];
273 for (
unsigned iSt = 0; iSt < 4; iSt++)
m_mVector[
"useSl"][2 * iSt + 1] =
m_mVector[
"useAxSl"][iSt];
276 for (
unsigned iSt = 0; iSt < 4; iSt++) {
278 const vector<TCLink*>& links = aTrack.links(iSt * 2 + 1);
279 const TCSegment* t_segment =
dynamic_cast<const TCSegment*
>(& links[0]->hit()->cell());
280 m_mVector[
"tsId"][iSt * 2 + 1] = t_segment->localId();
282 m_mVector[
"lutLR"][iSt * 2 + 1] = t_segment->LUT()->getValue(t_segment->lutPattern());
283 if (
m_mBool[
"fMc"])
m_mVector[
"mcLR"][iSt * 2 + 1] = t_segment->hit()->mcLR() + 1;
284 m_mVector[
"driftLength"][iSt * 2 + 1] = t_segment->hit()->drift();
285 m_mVector[
"tdc"][iSt * 2 + 1] = t_segment->priorityTime();
291 m_mVector[
"wirePhi"][iSt * 2 + 1] = 9999;
294 m_mVector[
"driftLength"][iSt * 2 + 1] = 9999;
298 else m_mVector[
"LR"][iSt * 2 + 1] = 9999;
305 for (
unsigned iSt = 0; iSt < 4; iSt++) {
309 for (
unsigned iSt = 0; iSt < 4; iSt++) {
312 string tableName =
"driftLengthTableSL" + to_string(iSt * 2 + 1);
314 if (t_driftTime < 0) t_driftTime = 0;
315 double t_driftLength =
m_mConstV[tableName][(unsigned)t_driftTime];
324 m_mVector[
"zError"] = vector<double> (4);
325 for (
unsigned iSt = 0; iSt < 4; iSt++) {
337 m_mVector[
"iZError2"] = vector<double> (4);
338 for (
unsigned iSt = 0; iSt < 4; iSt++) {
348 for (
unsigned iSt = 0; iSt < 4; iSt++) {
359 for (
unsigned iSt = 0; iSt < 4; iSt++) {
381 aTrack.setDebugValue(TRGCDCTrack::EDebugValueType::fit3D, 1);
382 if (
m_mBool[
"fVerbose"]) cout <<
"Exit due to 3D fit cot result:" <<
m_mDouble[
"cot"] << endl;
387 if (
m_mBool[
"fVerbose"]) cout <<
"Fit was done successfully." << endl;
390 CLHEP::HepVector a(5);
391 a = aTrack.helix().a();
404 aTrack.set2DFitChi2(
m_mDouble[
"fit2DChi2"]);
406 aTrack.setHelix(helix);
419 HandleRoot::saveTrackValues(
"fitter3D",
436 for (
unsigned iTrack = 0; iTrack < trackList.size(); iTrack++) {
437 TCTrack& aTrack = * trackList[iTrack];
438 if (aTrack.fitted() == 0) aTrack.setDebugValue(TRGCDCTrack::EDebugValueType::fit3D, 1);
443 for (
unsigned iTrack = 0; iTrack < trackList.size(); iTrack++) {
444 TCTrack& aTrack = *trackList[iTrack];
445 if (aTrack.fitted()) {
446 double fitZ0 = aTrack.helix().dz();
447 if (fitZ0 > 20 || fitZ0 < -20) aTrack.setDebugValue(TRGCDCTrack::EDebugValueType::fit3D, 1);
476 m_mDouble[
"eventNumber"] = eventMetaDataPtr->getEvent();
480 for (
unsigned iTrack = 0; iTrack < trackList.size(); iTrack++) {
482 TCTrack& aTrack = * trackList[iTrack];
489 m_mDouble[
"trackId"] = aTrack.getTrackID();
494 if (fit2DResult != 0) {
503 for (
unsigned iSt = 0; iSt < 4; iSt++) {
504 const vector<TCLink*>& links = aTrack.links(iSt * 2 + 1);
505 const unsigned nSegments = links.size();
506 cout <<
"iSt:" << iSt <<
" nSegments:" << nSegments << endl;
507 for (
unsigned iTS = 0; iTS < nSegments; iTS++) {
508 const TCSegment* t_segment =
dynamic_cast<const TCSegment*
>(& links[iTS]->hit()->cell());
509 cout <<
" tsId:" << t_segment->localId()
510 <<
" tdc:" << t_segment->priorityTime() <<
" lr:" << t_segment->LUT()->getValue(t_segment->lutPattern())
511 <<
" priorityPosition:" << t_segment->priorityPosition() << endl;
515 m_mVector[
"useStSl"] = vector<double> (4);
521 for (
unsigned iSt = 0; iSt < 4; iSt++) {
523 const vector<TCLink*>& links = aTrack.links(iSt * 2 + 1);
524 const TCSegment* t_segment =
dynamic_cast<const TCSegment*
>(& links[0]->hit()->cell());
525 m_mVector[
"tsId"][iSt * 2 + 1] = t_segment->localId();
527 m_mVector[
"lutLR"][iSt * 2 + 1] = t_segment->LUT()->getValue(t_segment->lutPattern());
528 if (
m_mBool[
"fMc"])
m_mVector[
"mcLR"][iSt * 2 + 1] = t_segment->hit()->mcLR() + 1;
529 m_mVector[
"driftLength"][iSt * 2 + 1] = t_segment->hit()->drift();
530 m_mVector[
"tdc"][iSt * 2 + 1] = t_segment->priorityTime();
536 m_mVector[
"wirePhi"][iSt * 2 + 1] = 9999;
539 m_mVector[
"driftLength"][iSt * 2 + 1] = 9999;
543 else m_mVector[
"LR"][iSt * 2 + 1] = 9999;
556 for (
unsigned iSt = 0; iSt < 4; iSt++) {
560 for (
unsigned iSt = 0; iSt < 4; iSt++) {
562 string tableName =
"driftLengthTableSL" + to_string(iSt * 2 + 1);
564 if (t_driftTime < 0) t_driftTime = 0;
565 double t_driftLength =
m_mConstV[tableName][(unsigned)t_driftTime];
572 m_mVector[
"zError"] = vector<double> (4);
573 for (
unsigned iSt = 0; iSt < 4; iSt++) {
581 m_mVector[
"iZError2"] = vector<double> (4);
582 for (
unsigned iSt = 0; iSt < 4; iSt++) {
613 double rhoMax = 2500;
622 m_mConstD[
"driftPhiLUTOutBitSize"] = phiBitSize - 1;
624 m_mConstD[
"acosLUTOutBitSize"] = phiBitSize - 1;
635 if (t_quadrant == 1)
m_mDouble[
"relRefPhi"] = 0;
641 else if (t_quadrant == 2)
m_mDouble[
"relRefPhi"] = 0;
647 m_mVector[
"relPhi3D"] = vector<double> (4);
648 for (
unsigned iSt = 0; iSt < 4;
652 m_mVector[
"relWirePhi3D"] = vector<double> (4);
653 for (
unsigned iSt = 0; iSt < 4; iSt++) {
656 while (rangeOk == 0) {
657 if (t_relWirePhi < 0) t_relWirePhi += 2 *
m_mConstD[
"Trg_PI"];
658 else if (t_relWirePhi > 2 *
m_mConstD[
"Trg_PI"]) t_relWirePhi -= 2 *
m_mConstD[
"Trg_PI"];
661 m_mVector[
"relWirePhi3D"][iSt] = t_relWirePhi;
665 m_mVector[
"relTsId3D"] = vector<double> (4);
666 for (
unsigned iSt = 0; iSt < 4;
673 m_mDouble[
"pt"] = rhoMax * 0.3 * 1.5 * 0.01;
680 m_mVector[
"unsignedTdc"] = vector<double> (9);
681 for (
unsigned iSt = 0; iSt < 4; iSt++) {
690 vector<tuple<string, double, int, double, double, int> > t_values = {
691 make_tuple(
"phi0",
m_mDouble[
"relPhi0"], phiBitSize, phiMin, phiMax, 0),
694 make_tuple(
"charge", (
int)(
m_mDouble[
"charge2D"] == 1 ? 1 : 0), 1, 0, 1.5, 0),
695 make_tuple(
"lr_0",
m_mVector[
"lutLR"][1], 2, 0, 3.5, 0),
696 make_tuple(
"lr_1",
m_mVector[
"lutLR"][3], 2, 0, 3.5, 0),
697 make_tuple(
"lr_2",
m_mVector[
"lutLR"][5], 2, 0, 3.5, 0),
698 make_tuple(
"lr_3",
m_mVector[
"lutLR"][7], 2, 0, 3.5, 0),
699 make_tuple(
"tsId_0",
m_mVector[
"relTsId3D"][0], ceil(log(
m_mConstV[
"nTSs"][1]) / log(2)), 0, pow(2, ceil(log(
m_mConstV[
"nTSs"][1]) / log(2))) - 0.5, 0),
700 make_tuple(
"tsId_1",
m_mVector[
"relTsId3D"][1], ceil(log(
m_mConstV[
"nTSs"][3]) / log(2)), 0, pow(2, ceil(log(
m_mConstV[
"nTSs"][3]) / log(2))) - 0.5, 0),
701 make_tuple(
"tsId_2",
m_mVector[
"relTsId3D"][2], ceil(log(
m_mConstV[
"nTSs"][5]) / log(2)), 0, pow(2, ceil(log(
m_mConstV[
"nTSs"][5]) / log(2))) - 0.5, 0),
702 make_tuple(
"tsId_3",
m_mVector[
"relTsId3D"][3], ceil(log(
m_mConstV[
"nTSs"][7]) / log(2)), 0, pow(2, ceil(log(
m_mConstV[
"nTSs"][7]) / log(2))) - 0.5, 0),
708 make_tuple(
"eventTimeValid", (
int)
m_mDouble[
"eventTimeValid"], 1, 0, 1.5, 0),
720 vector<tuple<string, double, int, double, double, int> > resultValues;
722 vector<pair<string, int> > t_chooseSignals = {
723 make_pair(
"z0", 0), make_pair(
"cot", 0), make_pair(
"chi2Sum", 0)
732 (*it).second.setName((*it).first);
753 vector<pair<string, int> > chooseValues = {
754 make_pair(
"zz_0",
m_mBool[
"fIsIntegerEffect"]),
755 make_pair(
"zz_1",
m_mBool[
"fIsIntegerEffect"]),
756 make_pair(
"zz_2",
m_mBool[
"fIsIntegerEffect"]),
757 make_pair(
"zz_3",
m_mBool[
"fIsIntegerEffect"]),
758 make_pair(
"arcS_0",
m_mBool[
"fIsIntegerEffect"]),
759 make_pair(
"arcS_1",
m_mBool[
"fIsIntegerEffect"]),
760 make_pair(
"arcS_2",
m_mBool[
"fIsIntegerEffect"]),
761 make_pair(
"arcS_3",
m_mBool[
"fIsIntegerEffect"]),
762 make_pair(
"z0",
m_mBool[
"fIsIntegerEffect"]),
763 make_pair(
"cot",
m_mBool[
"fIsIntegerEffect"]),
764 make_pair(
"zChi2",
m_mBool[
"fIsIntegerEffect"])
767 vector<tuple<string, double, int, double, double, int> > outValues;
789 m_mVector[
"float_zz"] = vector<double> (4);
791 for (
unsigned iSt = 0; iSt < 4;
795 m_mVector[
"float_arcS"] = vector<double> (4);
796 for (
unsigned iSt = 0; iSt < 4;
806 for (
unsigned iSt = 0; iSt < 4; iSt++) cout <<
"float_zz[" << iSt <<
"] : " <<
m_mVector[
"float_zz"][iSt] <<
" ";
808 for (
unsigned iSt = 0; iSt < 4; iSt++) cout <<
"float_arcS[" << iSt <<
"] : " <<
m_mVector[
"float_arcS"][iSt] <<
" ";
810 cout <<
"float_z0: " <<
m_mDouble[
"float_z0"] << endl;
811 cout <<
"float_zChi2: " <<
m_mDouble[
"float_zChi2"] << endl;
825 CLHEP::HepVector a(5);
826 a = aTrack.helix().a();
839 aTrack.setHelix(helix);
840 aTrack.set2DFitChi2(
m_mDouble[
"fit2DChi2"]);
854 HandleRoot::saveTrackValues(
"fitter3D",
871 for (
unsigned iTrack = 0; iTrack < trackList.size(); iTrack++) {
872 TCTrack& aTrack = * trackList[iTrack];
873 if (aTrack.fitted() == 0) aTrack.setDebugValue(TRGCDCTrack::EDebugValueType::fit3D, 1);
878 for (
unsigned iTrack = 0; iTrack < trackList.size(); iTrack++) {
879 TCTrack& aTrack = *trackList[iTrack];
880 if (aTrack.fitted()) {
881 double fitZ0 = aTrack.helix().dz();
882 if (fitZ0 > 20 || fitZ0 < -20) aTrack.setDebugValue(TRGCDCTrack::EDebugValueType::fit3D, 1);
926 it->second->makeCOE(it->first +
".coe");
947 for (
unsigned iSt = 0; iSt < 4;
950 for (
unsigned iSt = 0; iSt < 4;
962 std::map<std::string, double>& m_mDouble_in, std::map<std::string, std::vector<double> >& m_mVector_in)
965 const TCRelation& trackRelation = aTrack->
relation();
967 const MCParticle& trackMCParticle = trackRelation.mcParticle(0);
970 TVector3 vertex = trackMCParticle.
getVertex();
971 TLorentzVector vector4 = trackMCParticle.
get4Vector();
972 TVector2 helixCenter;
973 TVector3 impactPosition;
975 m_mVector_in[
"mcVertex"] = vector<double> ({vertex.X(), vertex.Y(), vertex.Z()});
976 m_mVector_in[
"mcMomentum"] = vector<double> ({vector4.Px(), vector4.Py(), vector4.Pz()});
977 m_mVector_in[
"helixCenter"] = vector<double> ({helixCenter.X(), helixCenter.Y()});
978 m_mVector_in[
"impactPosition"] = vector<double> ({impactPosition.X(), impactPosition.Y(), impactPosition.Z()});
981 m_mDouble_in[
"mcPt"] = trackMCParticle.
getMomentum().Pt();
982 m_mDouble_in[
"mcPhi0"] = 0;
983 if (trackMCParticle.
getCharge() > 0) m_mDouble_in[
"mcPhi0"] = trackMCParticle.
getMomentum().Phi() - m_mConstD_in[
"Trg_PI"] / 2;
984 if (trackMCParticle.
getCharge() < 0) m_mDouble_in[
"mcPhi0"] = trackMCParticle.
getMomentum().Phi() + m_mConstD_in[
"Trg_PI"] / 2;
986 if (m_mDouble_in[
"mcPhi0"] < 0) m_mDouble_in[
"mcPhi0"] += 2 * m_mConstD_in[
"Trg_PI"];
988 m_mDouble_in[
"mcZ0"] = impactPosition.Z();
990 m_mDouble_in[
"mcCharge"] = trackMCParticle.
getCharge();
993 TVectorD mcStatus(3);
994 m_mDouble_in[
"mcStatus"] = trackMCParticle.
getStatus();
995 m_mDouble_in[
"pdgId"] = trackMCParticle.
getPDG();
999 unsigned id = trackRelation.contributor(0);
1000 vector<const TCSHit*> mcAllTSList[9];
1001 vector<const TCSHit*> mcTSList(9);
1003 const vector<const TCSHit*> hits = m_cdc_in.
segmentHits();
1004 for (
unsigned i = 0; i < hits.size(); i++) {
1005 const TCSHit& ts = * hits[i];
1006 if (! ts.signal().active())
continue;
1007 const TCWHit* wh = ts.segment().center().hit();
1009 const unsigned trackId = wh->iMCParticle();
1011 mcAllTSList[wh->wire().superLayerId()].push_back(& ts);
1014 for (
unsigned i = 0; i < 9; i++) {
1015 const TCSHit* best = 0;
1016 if (mcAllTSList[i].size() == 0) {
1017 }
else if (mcAllTSList[i].size() == 1) {
1018 best = mcAllTSList[i][0];
1020 int timeMin = 99999;
1021 for (
unsigned k = 0; k < mcAllTSList[i].size(); k++) {
1022 const TRGSignal& timing = mcAllTSList[i][k]->signal();
1023 const TRGTime& t = * timing[0];
1024 if (t.time() < timeMin) {
1026 best = mcAllTSList[i][k];
1035 m_mVector_in[
"mcPosX"] = vector<double> ({9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999});
1036 m_mVector_in[
"mcPosY"] = vector<double> ({9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999});
1037 m_mVector_in[
"mcPosZ"] = vector<double> ({9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999});
1038 for (
unsigned iSL = 0; iSL < 9; iSL++) {
1039 if (mcTSList[iSL] != 0) {
1040 TVector3 posTrack = mcTSList[iSL]->simHit()->getPosTrack();
1041 m_mVector_in[
"mcPosX"][iSL] = posTrack.X();
1042 m_mVector_in[
"mcPosY"][iSL] = posTrack.Y();
1043 m_mVector_in[
"mcPosZ"][iSL] = posTrack.Z();
1047 m_mVector_in[
"simMcLR"] = vector<double> (9);
1048 for (
unsigned iSL = 0; iSL < 9; iSL++) {
1049 if (mcTSList[iSL] != 0) {
1050 m_mVector_in[
"simMcLR"][iSL] = mcTSList[iSL]->simHit()->getPosFlag();
1072 for (
unsigned iAx = 0; iAx < 5; iAx++) {
1074 const vector<TCLink*>& links = aTrack.
links(iAx * 2);
1075 const unsigned nSegments = links.size();
1078 bool priorityHitTS = 0;
1079 for (
unsigned iTS = 0; iTS < nSegments; iTS++) {
1080 const TCSegment* t_segment =
dynamic_cast<const TCSegment*
>(& links[iTS]->hit()->cell());
1081 if (t_segment->center().hit() != 0) priorityHitTS = 1;
1083 if (nSegments != 1) {
1084 if (nSegments == 0) {
1086 if (
m_mBool[
"fIsPrintError"]) cout <<
"Fitter3D::isAxialTrackFull() => There are no TS." << endl;
1088 if (
m_mBool[
"fIsPrintError"]) cout <<
"Fitter3D::isAxialTrackFull() => multiple TS are assigned." << endl;
1091 if (priorityHitTS == 0) {
1093 if (
m_mBool[
"fIsPrintError"]) cout <<
"Fitter3D::isAxialTrackFull() => There are no priority hit TS" << endl;
1103 for (
unsigned iSt = 0; iSt < 4; iSt++) {
1105 const vector<TCLink*>& links = aTrack.
links(iSt * 2 + 1);
1106 const unsigned nSegments = links.size();
1109 bool priorityHitTS = 0;
1110 for (
unsigned iTS = 0; iTS < nSegments; iTS++) {
1111 const TCSegment* t_segment =
dynamic_cast<const TCSegment*
>(& links[iTS]->hit()->cell());
1112 if (t_segment->center().hit() != 0) priorityHitTS = 1;
1114 if (nSegments != 1) {
1115 if (nSegments == 0) {
1117 if (
m_mBool[
"fIsPrintError"]) cout <<
"Fitter3D::isStereoTrackFull() => There are no TS." << endl;
1119 if (
m_mBool[
"fIsPrintError"]) cout <<
"Fitter3D::isStereoTrackFull() => multiple TS are assigned." << endl;
1122 if (priorityHitTS == 0) {
1124 if (
m_mBool[
"fIsPrintError"]) cout <<
"Fitter3D::isStereoTrackFull() => There are no priority hit TS" << endl;
1133 useAxSl.assign(5, 1);
1134 for (
unsigned iAx = 0; iAx < 5; iAx++) {
1136 const vector<TCLink*>& links = aTrack.
links(iAx * 2);
1137 const unsigned nSegments = links.size();
1140 bool priorityHitTS = 0;
1142 for (
unsigned iTS = 0; iTS < nSegments; iTS++) {
1143 const TCSegment* t_segment =
dynamic_cast<const TCSegment*
>(& links[iTS]->hit()->cell());
1144 if (t_segment->center().hit() != 0) priorityHitTS = 1;
1147 if (nSegments != 1) {
1148 if (nSegments == 0) {
1151 if (printError) cout <<
"Fitter3D::findHitAxialSuperlayers() => multiple TS are assigned." << endl;
1154 if (priorityHitTS == 0) {
1156 if (printError) cout <<
"Fitter3D::findHitAxialSuperlayers() => There are no priority hit TS" << endl;
1164 useStSl.assign(4, 1);
1165 for (
unsigned iSt = 0; iSt < 4; iSt++) {
1167 const vector<TCLink*>& links = aTrack.
links(iSt * 2 + 1);
1168 const unsigned nSegments = links.size();
1171 bool priorityHitTS = 0;
1172 for (
unsigned iTS = 0; iTS < nSegments; iTS++) {
1173 const TCSegment* t_segment =
dynamic_cast<const TCSegment*
>(& links[iTS]->hit()->cell());
1174 if (t_segment->center().hit() != 0) priorityHitTS = 1;
1176 if (nSegments != 1) {
1177 if (nSegments == 0) {
1180 if (printError) cout <<
"Fitter3D::findHitStereoSuperlayers() => multiple TS are assigned." << endl;
1183 if (priorityHitTS == 0) {
1185 if (printError) cout <<
"Fitter3D::findHitStereoSuperlayers() => There are no priority hit TS" << endl;
1193 for (
unsigned iSt = 0; iSt < 4; iSt++) {
1197 if (
m_mBool[
"fIsPrintError"]) cout <<
"Fitter3D::removeImpossibleStereoSuperlayers() => pt is too low for SL." << endl;
1204 bestTSIndex.resize(5);
1205 std::fill_n(bestTSIndex.begin(), 5, -1);
1206 for (
unsigned iAx = 0; iAx < 5; iAx++) {
1208 const vector<TCLink*>& links = aTrack.
links(iAx * 2);
1209 const unsigned nSegments = links.size();
1212 vector<tuple<int, double> > tsCandiateInfo(nSegments);
1214 for (
unsigned iTS = 0; iTS < nSegments; iTS++) {
1215 const TCSegment* t_segment =
dynamic_cast<const TCSegment*
>(& links[iTS]->hit()->cell());
1216 int firstPriority = 0;
1217 if (t_segment->center().hit() != 0) firstPriority = 1;
1218 double tdc = t_segment->priorityTime();
1219 std::get<0>(tsCandiateInfo[iTS]) = firstPriority;
1220 std::get<1>(tsCandiateInfo[iTS]) = tdc;
1225 pair<int, tuple<int, double> > bestTS = make_pair(-1, make_tuple(-1, 9999));
1227 if (tsCandiateInfo.size() != 0) {
1240 for (
unsigned iTS = 0; iTS < nSegments; iTS++) {
1241 if (std::get<0>(tsCandiateInfo[iTS]) == 1) {
1243 if (bestTS.first == -1) select = 1;
1244 else if (std::get<1>(bestTS.second) > std::get<1>(tsCandiateInfo[iTS])) select = 1;
1247 bestTS.second = tsCandiateInfo[iTS];
1253 bestTSIndex[iAx] = bestTS.first;
1258 std::map<std::string, double>& m_mConstD_in,
1259 std::map<std::string, std::vector<double> >& m_mConstV_in, std::map<std::string, double>& m_mDouble_in,
1260 std::map<std::string, std::vector<double> >& m_mVector_in)
1262 m_mVector_in[
"useAxSl"] = vector<double> (5);
1266 vector<int> bestTSIndex(5);
1268 for (
unsigned iAx = 0; iAx < 5; iAx++) {
1269 if (bestTSIndex[iAx] != -1) m_mVector_in[
"useAxSl"][iAx] = 1;
1274 m_mDouble_in[
"nHitAx"] = m_mVector_in[
"useAxSl"][0] + m_mVector_in[
"useAxSl"][1] + m_mVector_in[
"useAxSl"][2] +
1275 m_mVector_in[
"useAxSl"][3] +
1276 m_mVector_in[
"useAxSl"][4];
1277 if (m_mDouble_in[
"nHitAx"] <= 1) {
1278 if (m_mBool_in[
"fVerbose"] == 1) cout <<
"[2DFit] Exiting because nHitAx is " << m_mDouble_in[
"nHitAx"] << endl;
1284 m_mVector_in[
"tsId"] = vector<double> (9);
1285 m_mVector_in[
"tsId2D"] = vector<double> (5);
1286 m_mVector_in[
"wirePhi"] = vector<double> (9);
1287 m_mVector_in[
"lutLR"] = vector<double> (9);
1288 m_mVector_in[
"LR"] = vector<double> (9);
1289 m_mVector_in[
"driftLength"] = vector<double> (9);
1290 m_mVector_in[
"tdc"] = vector<double> (9);
1291 if (m_mVector_in.find(
"mcLR") == m_mVector_in.end()) m_mVector_in[
"mcLR"] = vector<double> (9);
1292 for (
unsigned iAx = 0; iAx < 5; iAx++) {
1293 if (m_mVector_in[
"useAxSl"][iAx] == 1) {
1294 const vector<TCLink*>& links = aTrack.
links(iAx * 2);
1296 const TCSegment* t_segment =
dynamic_cast<const TCSegment*
>(& links[bestTSIndex[iAx]]->hit()->cell());
1297 m_mVector_in[
"tsId"][iAx * 2] = t_segment->localId();
1298 m_mVector_in[
"tsId2D"][iAx] = m_mVector_in[
"tsId"][iAx * 2];
1299 m_mVector_in[
"wirePhi"][iAx * 2] = (double) t_segment->localId() / m_mConstV_in[
"nWires"][iAx * 2] * 4 * m_mConstD_in[
"Trg_PI"];
1300 m_mVector_in[
"lutLR"][iAx * 2] = t_segment->LUT()->getValue(t_segment->lutPattern());
1302 if (m_mBool_in[
"fMc"]) m_mVector_in[
"mcLR"][iAx * 2] = t_segment->hit()->mcLR() + 1;
1303 m_mVector_in[
"driftLength"][iAx * 2] = t_segment->hit()->drift();
1304 m_mVector_in[
"tdc"][iAx * 2] = t_segment->priorityTime();
1305 if (m_mBool_in[
"fmcLR"] == 1) m_mVector_in[
"LR"][iAx * 2] = m_mVector_in[
"mcLR"][iAx * 2];
1306 else if (m_mBool_in[
"fLRLUT"] == 1) m_mVector_in[
"LR"][iAx * 2] = m_mVector_in[
"lutLR"][iAx * 2];
1307 else m_mVector_in[
"LR"][iAx * 2] = 3;
1309 m_mVector_in[
"tsId"][iAx * 2] = 9999;
1310 m_mVector_in[
"wirePhi"][iAx * 2] = 9999;
1311 m_mVector_in[
"lutLR"][iAx * 2] = 0;
1313 if (m_mBool_in[
"fMc"]) m_mVector_in[
"mcLR"][iAx * 2] = 9999;
1314 m_mVector_in[
"driftLength"][iAx * 2] = 9999;
1315 m_mVector_in[
"tdc"][iAx * 2] = 9999;
1316 if (m_mBool_in[
"fmcLR"] == 1) m_mVector_in[
"LR"][iAx * 2] = 9999;
1317 else if (m_mBool_in[
"fLRLUT"] == 1) m_mVector_in[
"LR"][iAx * 2] = 9999;
1318 else m_mVector_in[
"LR"][iAx * 2] = 9999;
1331 m_mDouble_in[
"phi02D"] = aTrack.
helix().
phi0();
1332 m_mDouble_in[
"pt2D"] = aTrack.
pt();
1333 if (aTrack.
charge() < 0) {
1334 m_mDouble_in[
"phi02D"] -= m_mConstD_in[
"Trg_PI"];
1335 if (m_mDouble_in[
"phi02D"] < 0) m_mDouble_in[
"phi02D"] += 2 * m_mConstD_in[
"Trg_PI"];
1337 m_mDouble_in[
"dr2D"] = aTrack.
helix().
dr() * 0.01;
1340 m_mDouble_in[
"charge"] = double(aTrack.
charge());
1342 m_mVector_in[
"phi2DError"] = vector<double> (5);
1343 for (
unsigned iAx = 0; iAx < 5; iAx++) {
1344 if (m_mVector_in[
"useAxSl"][iAx] == 1) {
1346 if (m_mVector_in[
"LR"][2 * iAx] != 3) m_mVector_in[
"phi2DError"][iAx] = m_mConstV_in[
"driftPhi2DError"][iAx];
1347 else m_mVector_in[
"phi2DError"][iAx] = m_mConstV_in[
"wirePhi2DError"][iAx];
1349 if (m_mDouble_in[
"eventTime"] == 9999) m_mVector_in[
"phi2DError"][iAx] = m_mConstV_in[
"wirePhi2DError"][iAx];
1351 m_mVector_in[
"phi2DError"][iAx] = 9999;
1355 m_mVector_in[
"phi2DInvError"] = vector<double> (5);
1356 for (
unsigned iAx = 0; iAx < 5; iAx++) {
1357 if (m_mVector_in[
"useAxSl"][iAx] == 1) {
1358 m_mVector_in[
"phi2DInvError"][iAx] = 1 / m_mVector_in[
"phi2DError"][iAx];
1360 m_mVector_in[
"phi2DInvError"][iAx] = 0;
1364 m_mVector_in[
"phi2D"] = vector<double> (5);
1365 if (m_mBool_in[
"f2DFitDrift"] == 0 || m_mDouble_in[
"eventTime"] == 9999) {
1366 for (
unsigned iAx = 0; iAx < 5; iAx++) {
1367 m_mVector_in[
"phi2D"][iAx] = m_mVector_in[
"wirePhi"][iAx * 2];
1370 for (
unsigned iAx = 0; iAx < 5; iAx++) {
1371 if (m_mVector_in[
"useAxSl"][iAx] == 1) {
1373 string tableName =
"driftLengthTableSL" + to_string(iAx * 2);
1374 double t_driftTime = m_mVector_in[
"tdc"][iAx * 2] - m_mDouble_in[
"eventTime"];
1375 if (t_driftTime < 0) t_driftTime = 0;
1376 if (t_driftTime > 511) t_driftTime = 511;
1377 double t_driftLength = m_mConstV_in[tableName][(unsigned)t_driftTime];
1378 m_mVector_in[
"phi2D"][iAx] =
Fitter3DUtility::calPhi(m_mVector_in[
"wirePhi"][iAx * 2], t_driftLength, m_mConstV_in[
"rr"][iAx * 2],
1379 m_mVector_in[
"LR"][iAx * 2]);
1381 m_mVector_in[
"phi2D"][iAx] = 9999;
1386 if (m_mBool_in[
"f2DFit"] == 0) {
1387 m_mDouble_in[
"rho"] = m_mDouble_in[
"pt2D"] / 0.01 / 1.5 / 0.299792458;
1388 m_mDouble_in[
"pt"] = 0.299792458 * 1.5 * m_mDouble_in[
"rho"] / 100;
1389 m_mDouble_in[
"phi0"] = m_mDouble_in[
"phi02D"];
1390 m_mDouble_in[
"fit2DChi2"] = 9999;
1392 m_mDouble_in[
"rho"] = 0;
1393 m_mDouble_in[
"phi0"] = 0;
1394 m_mDouble_in[
"fit2DChi2"] = 0;
1396 m_mDouble_in[
"rho"],
1397 m_mDouble_in[
"phi0"], m_mDouble_in[
"fit2DChi2"]);
1398 m_mDouble_in[
"pt"] = 0.3 * 1.5 * m_mDouble_in[
"rho"] / 100;
1403 m_mDouble_in[
"phi0"],
1404 m_mDouble_in[
"charge"], m_mDouble_in[
"charge2D"]);
1406 if (m_mBool_in[
"fVerbose"]) {
1407 cout <<
"[E" << int(m_mDouble_in[
"eventNumber"]) <<
"][T" << int(m_mDouble_in[
"trackId"]) <<
"]f2DFit: " <<
1408 m_mBool_in[
"f2DFit"] <<
1410 cout <<
"[E" << int(m_mDouble_in[
"eventNumber"]) <<
"][T" << int(m_mDouble_in[
"trackId"]) <<
"]evtTime: " <<
1411 m_mDouble_in[
"eventTime"]
1413 cout <<
"[E" << int(m_mDouble_in[
"eventNumber"]) <<
"][T" << int(m_mDouble_in[
"trackId"]) <<
"]wirePhi: " <<
1414 m_mVector_in[
"wirePhi"][0]
1415 <<
" " << m_mVector_in[
"wirePhi"][1] <<
" " << m_mVector_in[
"wirePhi"][2] <<
" " << m_mVector_in[
"wirePhi"][3] <<
" " <<
1416 m_mVector_in[
"wirePhi"][4] <<
" " << m_mVector_in[
"wirePhi"][5] <<
" " << m_mVector_in[
"wirePhi"][6] <<
" " <<
1417 m_mVector_in[
"wirePhi"][7] <<
" "
1418 << m_mVector_in[
"wirePhi"][8] << endl;
1419 cout <<
"[E" << int(m_mDouble_in[
"eventNumber"]) <<
"][T" << int(m_mDouble_in[
"trackId"]) <<
"]LR: " << int(
1420 m_mVector_in[
"LR"][0]) <<
" " << int(m_mVector_in[
"LR"][1]) <<
" " << int(m_mVector_in[
"LR"][2]) <<
" " << int(
1421 m_mVector_in[
"LR"][3]) <<
" " << int(m_mVector_in[
"LR"][4]) <<
" " << int(m_mVector_in[
"LR"][5]) <<
" " << int(
1422 m_mVector_in[
"LR"][6]) <<
" " << int(m_mVector_in[
"LR"][7]) <<
" " << int(m_mVector_in[
"LR"][8]) << endl;
1423 cout <<
"[E" << int(m_mDouble_in[
"eventNumber"]) <<
"][T" << int(m_mDouble_in[
"trackId"]) <<
"]drift: " <<
1424 m_mVector_in[
"driftLength"][0] <<
" " << m_mVector_in[
"driftLength"][1] <<
" " << m_mVector_in[
"driftLength"][2] <<
" " <<
1425 m_mVector_in[
"driftLength"][3] <<
" " << m_mVector_in[
"driftLength"][4] <<
" " << m_mVector_in[
"driftLength"][5] <<
" " <<
1426 m_mVector_in[
"driftLength"][6] <<
" " << m_mVector_in[
"driftLength"][7] <<
" " << m_mVector_in[
"driftLength"][8] << endl;
1427 cout <<
"[E" << int(m_mDouble_in[
"eventNumber"]) <<
"][T" << int(m_mDouble_in[
"trackId"]) <<
"]tdc: " <<
1428 m_mVector_in[
"tdc"][0] <<
1429 " " << m_mVector_in[
"tdc"][1] <<
" " << m_mVector_in[
"tdc"][2] <<
" " << m_mVector_in[
"tdc"][3] <<
" " << m_mVector_in[
"tdc"][4] <<
1431 m_mVector_in[
"tdc"][5] <<
" " << m_mVector_in[
"tdc"][6] <<
" " << m_mVector_in[
"tdc"][7] <<
" " << m_mVector_in[
"tdc"][8] << endl;
1432 cout <<
"[E" << int(m_mDouble_in[
"eventNumber"]) <<
"][T" << int(m_mDouble_in[
"trackId"]) <<
"]rr2D: " <<
1433 m_mConstV_in[
"rr2D"][0] <<
1434 " " << m_mConstV_in[
"rr2D"][1] <<
" " << m_mConstV_in[
"rr2D"][2] <<
" " << m_mConstV_in[
"rr2D"][3] <<
" " << m_mConstV_in[
"rr2D"][4]
1436 cout <<
"[E" << int(m_mDouble_in[
"eventNumber"]) <<
"][T" << int(m_mDouble_in[
"trackId"]) <<
"]Phi2D: " <<
1437 m_mVector_in[
"phi2D"][0]
1438 <<
" " << m_mVector_in[
"phi2D"][1] <<
" " << m_mVector_in[
"phi2D"][2] <<
" " << m_mVector_in[
"phi2D"][3] <<
" " <<
1439 m_mVector_in[
"phi2D"][4] <<
1441 cout <<
"[E" << int(m_mDouble_in[
"eventNumber"]) <<
"][T" << int(m_mDouble_in[
"trackId"]) <<
"]Phi2DInvError: " <<
1442 m_mVector_in[
"phi2DInvError"][0] <<
" " << m_mVector_in[
"phi2DInvError"][1] <<
" " << m_mVector_in[
"phi2DInvError"][2] <<
" " <<
1443 m_mVector_in[
"phi2DInvError"][3] <<
" " << m_mVector_in[
"phi2DInvError"][4] << endl;
1444 cout <<
"[E" << int(m_mDouble_in[
"eventNumber"]) <<
"][T" << int(m_mDouble_in[
"trackId"]) <<
"]charge: " << int(
1445 m_mDouble_in[
"charge"]) << endl;
1446 cout <<
"[E" << int(m_mDouble_in[
"eventNumber"]) <<
"][T" << int(m_mDouble_in[
"trackId"]) <<
"]charge2D: " << int(
1447 m_mDouble_in[
"charge2D"]) << endl;
1448 cout <<
"[E" << int(m_mDouble_in[
"eventNumber"]) <<
"][T" << int(m_mDouble_in[
"trackId"]) <<
"]pt: " <<
1449 m_mDouble_in[
"pt"] <<
1451 cout <<
"[E" << int(m_mDouble_in[
"eventNumber"]) <<
"][T" << int(m_mDouble_in[
"trackId"]) <<
"]rho: " <<
1452 m_mDouble_in[
"rho"] <<
1454 cout <<
"[E" << int(m_mDouble_in[
"eventNumber"]) <<
"][T" << int(m_mDouble_in[
"trackId"]) <<
"]phi0: " <<
1455 m_mDouble_in[
"phi0"] <<
1456 " " << m_mDouble_in[
"phi0"] / m_mConstD_in[
"Trg_PI"] * 180 << endl;
1457 cout <<
"[E" << int(m_mDouble_in[
"eventNumber"]) <<
"][T" << int(m_mDouble_in[
"trackId"]) <<
"]fit2DChi2: " <<
1458 m_mDouble_in[
"fit2DChi2"]
1460 cout <<
"[E" << int(m_mDouble_in[
"eventNumber"]) <<
"][T" << int(m_mDouble_in[
"trackId"]) <<
"]useAxSl: " << int(
1461 m_mVector_in[
"useAxSl"][0]) <<
" " << int(m_mVector_in[
"useAxSl"][1]) <<
" " << int(m_mVector_in[
"useAxSl"][2]) <<
" " << int(
1462 m_mVector_in[
"useAxSl"][3]) << endl;
1465 if (std::isnan(m_mDouble_in[
"rho"]) || std::isnan(m_mDouble_in[
"phi0"])) {
1466 if (m_mBool_in[
"fVerbose"] == 1) cout <<
"[2Dfit] Exiting because rho or phi0 is nan." << endl;
1474 cout <<
"[E" << int(
m_mDouble[
"eventNumber"]) <<
"][T" << iTrack <<
"]evtTime: " <<
m_mDouble[
"eventTime"] << endl;
1475 cout <<
"[E" << int(
m_mDouble[
"eventNumber"]) <<
"][T" << iTrack <<
"]wirePhi: " <<
m_mVector[
"wirePhi"][0] <<
" " <<
1479 cout <<
"[E" << int(
m_mDouble[
"eventNumber"]) <<
"][T" << iTrack <<
"]LR: " << int(
m_mVector[
"LR"][0]) <<
" " << int(
1483 cout <<
"[E" << int(
m_mDouble[
"eventNumber"]) <<
"][T" << iTrack <<
"]lutLR: " << int(
m_mVector[
"lutLR"][0]) <<
" " << int(
1487 cout <<
"[E" << int(
m_mDouble[
"eventNumber"]) <<
"][T" << iTrack <<
"]useStSl: " << int(
m_mVector[
"useStSl"][0]) <<
" " << int(
1489 cout <<
"[E" << int(
m_mDouble[
"eventNumber"]) <<
"][T" << iTrack <<
"]drift: " <<
m_mVector[
"driftLength"][0] <<
" " <<
1493 cout <<
"[E" << int(
m_mDouble[
"eventNumber"]) <<
"][T" << iTrack <<
"]tdc: " <<
m_mVector[
"tdc"][0] <<
" " <<
1496 cout <<
"[E" << int(
m_mDouble[
"eventNumber"]) <<
"][T" << iTrack <<
"]Phi2D: " <<
m_mVector[
"phi2D"][0] <<
" " <<
1498 cout <<
"[E" << int(
m_mDouble[
"eventNumber"]) <<
"][T" << iTrack <<
"]Phi3D: " <<
m_mVector[
"phi3D"][0] <<
" " <<
1502 cout <<
"[E" << int(
m_mDouble[
"eventNumber"]) <<
"][T" << iTrack <<
"]arcS: " <<
m_mVector[
"arcS"][0] <<
" " <<
1504 cout <<
"[E" << int(
m_mDouble[
"eventNumber"]) <<
"][T" << iTrack <<
"]zerror: " <<
m_mVector[
"zError"][0] <<
" " <<
1506 cout <<
"[E" << int(
m_mDouble[
"eventNumber"]) <<
"][T" << iTrack <<
"]izerror: " <<
m_mVector[
"iZError2"][0] <<
" " <<
1508 cout <<
"[E" << int(
m_mDouble[
"eventNumber"]) <<
"][T" << iTrack <<
"]charge: " << int(
m_mDouble[
"charge"]) << endl;
1509 cout <<
"[E" << int(
m_mDouble[
"eventNumber"]) <<
"][T" << iTrack <<
"]pt: " <<
m_mDouble[
"pt"] << endl;
1510 cout <<
"[E" << int(
m_mDouble[
"eventNumber"]) <<
"][T" << iTrack <<
"]phi0: " <<
m_mDouble[
"phi0"] << endl;
1511 cout <<
"[E" << int(
m_mDouble[
"eventNumber"]) <<
"][T" << iTrack <<
"]z0: " <<
m_mDouble[
"z0"] << endl;
1512 cout <<
"[E" << int(
m_mDouble[
"eventNumber"]) <<
"][T" << iTrack <<
"]cot: " <<
m_mDouble[
"cot"] << endl;
1513 cout <<
"[E" << int(
m_mDouble[
"eventNumber"]) <<
"][T" << iTrack <<
"]chi2: " <<
m_mDouble[
"zChi2"] << endl;
1515 cout <<
"[E" << int(
m_mDouble[
"eventNumber"]) <<
"][T" << iTrack <<
"]mcCharge: " << int(
m_mDouble[
"mcCharge"]) << endl;
1516 cout <<
"[E" << int(
m_mDouble[
"eventNumber"]) <<
"][T" << iTrack <<
"]mcPosZ: " <<
m_mVector[
"mcPosZ"][1] <<
" " <<
1518 cout <<
"[E" << int(
m_mDouble[
"eventNumber"]) <<
"][T" << iTrack <<
"]mcPosZ: " <<
m_mVector[
"mcPosZ"][1] <<
" " <<
1520 cout <<
"[E" << int(
m_mDouble[
"eventNumber"]) <<
"][T" << iTrack <<
"]mcLR: " << int(
m_mVector[
"mcLR"][0]) <<
" " << int(
1548 return string(
"TRGCDCFitter3D 6.0");
1558 stGeometry[
"priorityLayer"] = {10, 22, 34, 46};
1559 stGeometry[
"nWires"] = vector<double> (4);
1560 stGeometry[
"cdcRadius"] = vector<double> (4);
1561 stGeometry[
"zToStraw"] = vector<double> (4);
1562 stGeometry[
"nShift"] = vector<double> (4);
1563 stGeometry[
"angleSt"] = vector<double> (4);
1565 for (
int iSt = 0; iSt < 4; ++iSt) {
1566 stGeometry[
"nWires"][iSt] = cdc.nWiresInLayer(stGeometry[
"priorityLayer"][iSt]) * 2;
1567 stGeometry[
"cdcRadius"][iSt] = cdc.senseWireR(stGeometry[
"priorityLayer"][iSt]);
1568 stGeometry[
"zToStraw"][iSt] = cdc.senseWireBZ(stGeometry[
"priorityLayer"][iSt]);
1569 stGeometry[
"nShift"][iSt] = cdc.nShifts(stGeometry[
"priorityLayer"][iSt]);
1570 stGeometry[
"angleSt"][iSt] = 2 * stGeometry[
"cdcRadius"][iSt] * sin(M_PI * stGeometry[
"nShift"][iSt] /
1571 (stGeometry[
"nWires"][iSt])) /
1572 (cdc.senseWireFZ(stGeometry[
"priorityLayer"][iSt]) - stGeometry[
"zToStraw"][iSt]);
1578 stXts.resize(stPriorityLayer.size(), vector<double> (512));
1580 for (
unsigned iSt = 0; iSt < stPriorityLayer.size(); ++iSt) {
1581 for (
unsigned iTick = 0; iTick < stXts[iSt].size(); ++iTick) {
1582 double t = iTick * 2 * cdc.getTdcBinWidth();
1584 stXts[iSt][iTick] = cdc.getNominalDriftV() * t;
1586 double driftLength_0 = cdc.getDriftLength(t, stPriorityLayer[iSt], 0);
1587 double driftLength_1 = cdc.getDriftLength(t, stPriorityLayer[iSt], 1);
1588 stXts[iSt][iTick] = (driftLength_0 + driftLength_1) / 2;
1598 mConstD[
"Trg_PI"] = 3.141592653589793;
1599 mConstV[
"priorityLayer"] = {3, 10, 16, 22, 28, 34, 40, 46, 52};
1600 mConstV[
"rr"] = vector<double> (9);
1601 mConstV[
"nWires"] = vector<double> (9);
1602 mConstV[
"nTSs"] = vector<double> (9);
1603 for (
unsigned iSL = 0; iSL < 9; iSL++) {
1604 unsigned t_layerId = mConstV[
"priorityLayer"][iSL];
1605 mConstV[
"rr"][iSL] = cdc.senseWireR(t_layerId);
1606 mConstV[
"nWires"][iSL] = cdc.nWiresInLayer(t_layerId) * 2;
1607 mConstV[
"nTSs"][iSL] = cdc.nWiresInLayer(t_layerId);
1609 mConstV[
"nTSs2D"] = vector<double> (5);
1610 for (
unsigned iAx = 0; iAx < 5; iAx++) {
1611 mConstV[
"nTSs2D"][iAx] = mConstV[
"nTSs"][2 * iAx];
1613 mConstV[
"zToStraw"] = vector<double> (4);
1614 mConstV[
"zToOppositeStraw"] = vector<double> (4);
1615 mConstV[
"angleSt"] = vector<double> (4);
1616 mConstV[
"nShift"] = vector<double> (4);
1617 for (
int iSt = 0; iSt < 4; iSt++) {
1618 unsigned t_layerId = mConstV[
"priorityLayer"][iSt * 2 + 1];
1619 mConstV[
"zToStraw"][iSt] = cdc.senseWireBZ(t_layerId);
1620 mConstV[
"zToOppositeStraw"][iSt] = cdc.senseWireFZ(t_layerId);
1621 mConstV[
"angleSt"][iSt] = 2 * mConstV[
"rr"][2 * iSt + 1] * sin(mConstD[
"Trg_PI"] * cdc.nShifts(t_layerId) /
1622 (2 * cdc.nWiresInLayer(t_layerId))) / (cdc.senseWireFZ(t_layerId) - cdc.senseWireBZ(t_layerId));
1623 mConstV[
"nShift"][iSt] = cdc.nShifts(t_layerId);
1626 mConstV[
"rr2D"] = vector<double> (5);
1627 mConstV[
"rr3D"] = vector<double> (4);
1628 for (
int iAx = 0; iAx < 5; iAx++) mConstV[
"rr2D"][iAx] = mConstV[
"rr"][iAx * 2];
1629 for (
int iSt = 0; iSt < 4; iSt++) mConstV[
"rr3D"][iSt] = mConstV[
"rr"][iSt * 2 + 1];
1631 mConstV[
"wirePhi2DError"] = vector<double> (5);
1632 mConstV[
"driftPhi2DError"] = vector<double> (5);
1633 mConstV[
"wirePhi2DError"][0] = 0.00085106;
1634 mConstV[
"wirePhi2DError"][1] = 0.00039841;
1635 mConstV[
"wirePhi2DError"][2] = 0.00025806;
1636 mConstV[
"wirePhi2DError"][3] = 0.00019084;
1637 mConstV[
"wirePhi2DError"][4] = 0.0001514;
1638 mConstV[
"driftPhi2DError"][0] = 0.00085106;
1639 mConstV[
"driftPhi2DError"][1] = 0.00039841;
1640 mConstV[
"driftPhi2DError"][2] = 0.00025806;
1641 mConstV[
"driftPhi2DError"][3] = 0.00019084;
1642 mConstV[
"driftPhi2DError"][4] = 0.0001514;
1643 mConstV[
"driftZError"] = vector<double> ({0.7676, 0.9753, 1.029, 1.372});
1644 mConstV[
"wireZError"] = vector<double> ({0.7676, 0.9753, 1.029, 1.372});
1648 for (
unsigned iSl = 0; iSl < 9; iSl++) {
1649 string tableName =
"driftLengthTableSL" + to_string(iSl);
1650 unsigned tableSize = 512;
1651 mConstV[tableName] = vector<double> (tableSize);
1652 unsigned t_layer = mConstV[
"priorityLayer"][iSl];
1653 for (
unsigned iTick = 0; iTick < tableSize; iTick++) {
1654 double t_driftTime = iTick * 2 * cdc.getTdcBinWidth();
1655 double avgDriftLength = 0;
1656 if (isXtSimple == 1) {
1657 avgDriftLength = cdc.getNominalDriftV() * t_driftTime;
1659 double driftLength_0 = cdc.getDriftLength(t_driftTime, t_layer, 0);
1660 double driftLength_1 = cdc.getDriftLength(t_driftTime, t_layer, 1);
1661 avgDriftLength = (driftLength_0 + driftLength_1) / 2;
1663 mConstV[tableName][iTick] = avgDriftLength;
1667 mConstD[
"tdcBitSize"] = 9;
1668 mConstD[
"rhoBitSize"] = 11;
1669 mConstD[
"iError2BitSize"] = 8;
1670 mConstD[
"iError2Max"] = 1 / pow(mConstV[
"wireZError"][0], 2);
1673 mConstD[
"phiMax"] = mConstD[
"Trg_PI"];
1674 mConstD[
"phiMin"] = -mConstD[
"Trg_PI"];
1675 mConstD[
"rhoMin"] = 20;
1676 mConstD[
"rhoMax"] = 2500;
1677 mConstD[
"phiBitSize"] = 13;
1678 mConstD[
"driftPhiLUTOutBitSize"] = mConstD[
"phiBitSize"] - 1;
1679 mConstD[
"driftPhiLUTInBitSize"] = mConstD[
"tdcBitSize"];
1680 mConstD[
"acosLUTOutBitSize"] = mConstD[
"phiBitSize"] - 1;
1681 mConstD[
"acosLUTInBitSize"] = mConstD[
"rhoBitSize"];
1682 mConstD[
"zLUTInBitSize"] = mConstD[
"phiBitSize"];
1683 mConstD[
"zLUTOutBitSize"] = 9;
1684 mConstD[
"iDenLUTInBitSize"] = 13;
1685 mConstD[
"iDenLUTOutBitSize"] = 11;