24 if (
output ==
"trackout") {
31 throw cms::Exception(
"BadConfig") << __FILE__ <<
" " << __LINE__ <<
" addOutput, output = " <<
output <<
" not known";
39 if (
input.substr(0, 4) ==
"tpar") {
45 if (
input.substr(0, 10) ==
"fullmatch1") {
51 if (
input.substr(0, 10) ==
"fullmatch2") {
57 if (
input.substr(0, 10) ==
"fullmatch3") {
63 if (
input.substr(0, 10) ==
"fullmatch4") {
70 throw cms::Exception(
"BadConfig") << __FILE__ <<
" " << __LINE__ <<
" input = " <<
input <<
" not found";
75 std::vector<const Stub*>& trackstublist,
88 for (
unsigned int j = 0;
j <
i->nMatches();
j++) {
89 if (
i->getTracklet(
j)->TCID() == tracklet->
TCID()) {
90 trackstublist.push_back(
i->getMatch(
j).second);
96 for (
unsigned int j = 0;
j <
i->nMatches();
j++) {
97 if (
i->getTracklet(
j)->TCID() == tracklet->
TCID()) {
98 trackstublist.push_back(
i->getMatch(
j).second);
104 for (
unsigned int j = 0;
j <
i->nMatches();
j++) {
105 if (
i->getTracklet(
j)->TCID() == tracklet->
TCID()) {
106 trackstublist.push_back(
i->getMatch(
j).second);
112 for (
unsigned int j = 0;
j <
i->nMatches();
j++) {
113 if (
i->getTracklet(
j)->TCID() == tracklet->
TCID()) {
114 trackstublist.push_back(
i->getMatch(
j).second);
121 for (
const auto&
it : trackstublist) {
122 int layer =
it->layer().value() + 1;
123 if (
it->layer().value() < 0) {
124 layer =
it->disk().value() + 10 *
it->disk().value() /
abs(
it->disk().value());
126 stubidslist.push_back(std::make_pair(layer,
it->phiregionaddress()));
135 hybridFitter.Fit(tracklet, trackstublist);
163 unsigned int ndisks = 0;
181 phiresidexact[
i] = 0.0;
182 zresidexact[
i] = 0.0;
185 std::bitset<N_LAYER> lmatches;
186 std::bitset<N_DISK * 2> dmatches;
190 unsigned int layermask = 0;
191 unsigned int diskmask = 0;
192 unsigned int alphaindex = 0;
193 unsigned int power = 1;
195 double t = tracklet->
t();
200 if (
l == (
unsigned int)tracklet->
layer() ||
l == (
unsigned int)tracklet->
layer() + 1) {
206 if (tracklet->
match(
l - 1)) {
221 for (
unsigned int d = 1;
d <=
N_DISK;
d++) {
222 if (layermask & (1 << (
d - 1)))
234 dmatches.set(2 *
d - 1);
235 diskmask |= (1 << (2 * (
N_DISK -
d) + 1));
242 alphaindex += ialpha *
power;
244 dmatches.set(2 * (
N_DISK -
d));
245 diskmask |= (1 << (2 * (
N_DISK -
d)));
263 << lmatches.to_string() <<
" " << dmatches.to_string() <<
" " <<
mult << endl;
269 for (
unsigned int l = 1;
l <= 2;
l++) {
270 if (tracklet->
match(
l - 1)) {
290 if (
d == 5 and layermask & (1 << 4))
296 dmatches.set(2 *
d1 - 1);
297 diskmask |= (1 << (2 * (
N_DISK -
d1) + 1));
309 dmatches.set(2 *
d1 - 1);
310 diskmask |= (1 << (2 * (
N_DISK -
d1) + 1));
317 alphaindex += ialpha *
power;
320 diskmask |= (1 << (2 * (
N_DISK -
d1)));
340 for (
unsigned int l = 1;
l <= 2;
l++) {
341 if (
l == (
unsigned int)tracklet->
layer()) {
347 if (tracklet->
match(
l - 1)) {
370 if (
d == tracklet->
disk()) {
372 dmatches.set(2 *
d1 - 1);
373 diskmask |= (1 << (2 * (
N_DISK -
d1) + 1));
385 diskmask |= (1 << (2 * (
N_DISK -
d1) + 1));
387 tmp.set(diskmask, 10);
394 alphaindex += ialpha *
power;
397 diskmask |= (1 << (2 * (
N_DISK -
d1)));
399 tmp.set(diskmask, 10);
427 if (derivatives ==
nullptr) {
430 tmpl.set(layermask, 6);
431 tmpd.
set(diskmask, 10);
432 edm::LogVerbatim(
"Tracklet") <<
"No derivative for layermask, diskmask : " << layermask <<
" " <<
tmpl.str()
433 <<
" " << diskmask <<
" " << tmpd.
str() <<
" eta = " << asinh(
t);
477 for (
unsigned i = 0;
i < ndisks;
i++) {
493 settings_,
nlayers, r, ndisks, z,
alpha,
t,
rinv,
D, iD, MinvDt, iMinvDt, sigma,
kfactor);
499 settings_,
nlayers, r, ndisks, z,
alpha,
t,
rinv,
D, iD, MinvDt, iMinvDt, sigma,
kfactor);
502 derivatives->
fill(tracklet->
fpgat().
value(), MinvDtDummy, iMinvDt);
520 double dr = realrstub[
i] - r[
i];
522 MinvDt[2][2 *
ii + 1] += dr * tder;
523 MinvDt[3][2 *
ii + 1] += dr * zder;
538 double tseed = tracklet->
tapprox();
539 double z0seed = tracklet->
z0approx();
541 double rinvseedexact = tracklet->
rinv();
542 double phi0seedexact = tracklet->
phi0();
543 double tseedexact = tracklet->
t();
544 double z0seedexact = tracklet->
z0();
546 double chisqseedexact = 0.0;
560 for (
unsigned int i = 0;
i <
n;
i++) {
562 iphiresid[
i] *= (
t / ttabi);
563 phiresid[
i] *= (
t / ttab);
564 phiresidexact[
i] *= (
t / ttab);
567 idelta[
j] = iphiresid[
i];
575 deltaexact[
j++] = phiresidexact[
i];
577 idelta[
j] = izresid[
i];
579 deltaexact[
j++] = zresidexact[
i];
581 chisqseedexact += (deltaexact[
j - 2] * deltaexact[
j - 2] + deltaexact[
j - 1] * deltaexact[
j - 1]);
590 double drinvexact = 0.0;
591 double dphi0exact = 0.0;
592 double dtexact = 0.0;
593 double dz0exact = 0.0;
600 double drinv_cov = 0.0;
601 double dphi0_cov = 0.0;
603 double dz0_cov = 0.0;
605 double drinv_covexact = 0.0;
606 double dphi0_covexact = 0.0;
607 double dt_covexact = 0.0;
608 double dz0_covexact = 0.0;
610 for (
unsigned int j = 0;
j < 2 *
n;
j++) {
611 drinv -= MinvDt[0][
j] *
delta[
j];
612 dphi0 -= MinvDt[1][
j] *
delta[
j];
614 dz0 -= MinvDt[3][
j] *
delta[
j];
621 drinvexact -= MinvDt[0][
j] * deltaexact[
j];
622 dphi0exact -= MinvDt[1][
j] * deltaexact[
j];
623 dtexact -= MinvDt[2][
j] * deltaexact[
j];
624 dz0exact -= MinvDt[3][
j] * deltaexact[
j];
626 drinv_covexact +=
D[0][
j] * deltaexact[
j];
627 dphi0_covexact +=
D[1][
j] * deltaexact[
j];
628 dt_covexact +=
D[2][
j] * deltaexact[
j];
629 dz0_covexact +=
D[3][
j] * deltaexact[
j];
631 idrinv += ((iMinvDt[0][
j] * idelta[
j]));
632 idphi0 += ((iMinvDt[1][
j] * idelta[
j]));
633 idt += ((iMinvDt[2][
j] * idelta[
j]));
634 idz0 += ((iMinvDt[3][
j] * idelta[
j]));
636 if (
false &&
j % 2 == 0) {
638 <<
" " << MinvDt[0][
j] <<
" " <<
delta[
j] * rstub[
j / 2] * 10000 <<
" \n" 646 double deltaChisqexact =
647 drinvexact * drinv_covexact + dphi0exact * dphi0_covexact + dtexact * dt_covexact + dz0exact * dz0_covexact;
662 double rinvfit = rinvseed - drinv;
663 double phi0fit = phi0seed - dphi0;
665 double tfit = tseed -
dt;
666 double z0fit = z0seed - dz0;
668 double rinvfitexact = rinvseedexact - drinvexact;
669 double phi0fitexact = phi0seedexact - dphi0exact;
671 double tfitexact = tseedexact - dtexact;
672 double z0fitexact = z0seedexact - dz0exact;
674 double chisqfitexact = chisqseedexact + deltaChisqexact;
677 bool NewChisqDebug =
false;
678 double chisqfit = 0.0;
689 <<
"drinv/cov = " << drinv <<
"/" << drinv_cov <<
" \n" 690 <<
"dphi0/cov = " << drinv <<
"/" << dphi0_cov <<
" \n" 691 <<
"dt/cov = " << drinv <<
"/" << dt_cov <<
" \n" 692 <<
"dz0/cov = " << drinv <<
"/" << dz0_cov <<
"\n";
694 for (
unsigned int i = 0;
i < 2 *
n;
i++) {
701 for (
unsigned int i = 0;
i <
n;
i++) {
703 phifactor = rstub[
k / 2] *
delta[
k] / sigma[
k] +
D[0][
k] * drinv +
D[1][
k] * dphi0 +
D[2][
k] *
dt +
D[3][
k] * dz0;
705 iD[0][
k] * idrinv - iD[1][
k] * idphi0 - iD[2][
k] * idt - iD[3][
k] * idz0;
709 <<
"sum = " << phifactor -
delta[
k] / sigma[
k] <<
" drinvterm = " <<
D[0][
k] * drinv
710 <<
" dphi0term = " <<
D[1][
k] * dphi0 <<
" dtterm = " <<
D[2][
k] *
dt 711 <<
" dz0term = " <<
D[3][
k] * dz0 <<
"\n phifactor = " << phifactor;
714 chisqfit += phifactor * phifactor;
719 rzfactor =
delta[
k] / sigma[
k] +
D[0][
k] * drinv +
D[1][
k] * dphi0 +
D[2][
k] *
dt +
D[3][
k] * dz0;
721 iD[1][
k] * idphi0 - iD[2][
k] * idt - iD[3][
k] * idz0;
725 <<
"sum = " << rzfactor -
delta[
k] / sigma[
k] <<
" drinvterm = " <<
D[0][
k] * drinv
726 <<
" dphi0term = " <<
D[1][
k] * dphi0 <<
" dtterm = " <<
D[2][
k] *
dt 727 <<
" dz0term = " <<
D[3][
k] * dz0 <<
"\n rzfactor = " << rzfactor;
730 chisqfit += rzfactor * rzfactor;
742 if (ichisqfit >= (1 << 15)) {
744 edm::LogVerbatim(
"Tracklet") <<
"CHISQUARE (" << ichisqfit <<
") LARGER THAN 11 BITS!";
746 ichisqfit = (1 << 15) - 1;
750 ichisqfit = ichisqfit >> 7;
752 if (ichisqfit >= (1 << 8))
753 ichisqfit = (1 << 8) - 1;
755 double phicrit = phi0fit - asin(0.5 *
settings_.
rcrit() * rinvfit);
818 std::vector<Tracklet*>
tmp;
820 std::vector<unsigned int> indexArray;
821 for (
auto& imatch : fullmatch) {
823 if (imatch->nMatches() > 1) {
824 for (
unsigned int j = 0;
j < imatch->nMatches() - 1;
j++) {
825 assert(imatch->getTracklet(
j)->TCID() <= imatch->getTracklet(
j + 1)->TCID());
830 edm::LogVerbatim(
"Tracklet") <<
"orderedMatches: " << imatch->getName() <<
" " << imatch->nMatches();
833 indexArray.push_back(0);
840 for (
unsigned int i = 0;
i < fullmatch.size();
i++) {
841 if (indexArray[
i] >= fullmatch[
i]->nMatches()) {
845 int TCID = fullmatch[
i]->getTracklet(indexArray[
i])->TCID();
846 if (TCID < bestTCID || bestTCID < 0) {
851 if (bestIndex != -1) {
852 tmp.push_back(fullmatch[bestIndex]->getTracklet(indexArray[bestIndex]));
853 indexArray[bestIndex]++;
855 }
while (bestIndex != -1);
857 for (
unsigned int i = 0;
i <
tmp.size();
i++) {
861 if (
tmp[
i - 1]->TCID() >
tmp[
i]->TCID()) {
877 vector<deque<StubStreamData>>& streamsStubRaw,
878 unsigned int iSector) {
887 if (
settings_.
debugTracklet() && (matches1.size() + matches2.size() + matches3.size() + matches4.size()) > 0) {
889 edm::LogVerbatim(
"Tracklet") << imatch->getName() <<
" " << imatch->nMatches();
892 << matches3.size() <<
" " << matches4.size();
895 unsigned int indexArray[4];
896 for (
unsigned int i = 0;
i < 4;
i++) {
900 unsigned int countAll = 0;
901 unsigned int countFit = 0;
906 bestTracklet =
nullptr;
908 if (indexArray[0] < matches1.size()) {
909 if (bestTracklet ==
nullptr) {
910 bestTracklet = matches1[indexArray[0]];
912 if (matches1[indexArray[0]]->TCID() < bestTracklet->
TCID())
913 bestTracklet = matches1[indexArray[0]];
917 if (indexArray[1] < matches2.size()) {
918 if (bestTracklet ==
nullptr) {
919 bestTracklet = matches2[indexArray[1]];
921 if (matches2[indexArray[1]]->TCID() < bestTracklet->
TCID())
922 bestTracklet = matches2[indexArray[1]];
926 if (indexArray[2] < matches3.size()) {
927 if (bestTracklet ==
nullptr) {
928 bestTracklet = matches3[indexArray[2]];
930 if (matches3[indexArray[2]]->TCID() < bestTracklet->
TCID())
931 bestTracklet = matches3[indexArray[2]];
935 if (indexArray[3] < matches4.size()) {
936 if (bestTracklet ==
nullptr) {
937 bestTracklet = matches4[indexArray[3]];
939 if (matches4[indexArray[3]]->TCID() < bestTracklet->
TCID())
940 bestTracklet = matches4[indexArray[3]];
944 if (bestTracklet ==
nullptr)
951 int nMatchesUniq = 0;
954 while (indexArray[0] < matches1.size() && matches1[indexArray[0]] == bestTracklet) {
964 while (indexArray[1] < matches2.size() && matches2[indexArray[1]] == bestTracklet) {
974 while (indexArray[2] < matches3.size() && matches3[indexArray[2]] == bestTracklet) {
984 while (indexArray[3] < matches4.size() && matches4[indexArray[3]] == bestTracklet) {
994 edm::LogVerbatim(
"Tracklet") <<
getName() <<
" : nMatches = " << nMatches <<
" nMatchesUniq = " << nMatchesUniq
995 <<
" " << asinh(bestTracklet->
t());
998 std::vector<const Stub*> trackstublist;
999 std::vector<std::pair<int, int>> stubidslist;
1002 nMatchesUniq >= 2) {
1007 trackFitFake(bestTracklet, trackstublist, stubidslist);
1009 trackFitKF(bestTracklet, trackstublist, stubidslist);
1013 trackFitFake(bestTracklet, trackstublist, stubidslist);
1024 }
else if (bestTracklet->
fit()) {
1027 ofstream
fout(
"seeds.txt", ofstream::app);
1028 fout << __FILE__ <<
":" << __LINE__ <<
" " <<
name_ <<
"_" 1029 <<
" " << bestTracklet->
getISeed() << endl;
1040 if (!bestTracklet->
fit()) {
1041 static const string invalid =
"0";
1042 streamTrackRaw.emplace_back(invalid);
1043 for (
auto&
stream : streamsStubRaw)
1049 const string phi0 = bestTracklet->
fpgaphi0().
str();
1050 const string z0 = bestTracklet->
fpgaz0().
str();
1051 const string t = bestTracklet->
fpgat().
str();
1052 const int seedType = bestTracklet->
getISeed();
1054 const string valid(
"1");
1055 streamTrackRaw.emplace_back(
valid +
seed +
rinv + phi0 + z0 +
t);
1058 unsigned int ihit(0);
1059 for (
unsigned int ilayer = 0; ilayer <
N_LAYER +
N_DISK; ilayer++) {
1060 if (bestTracklet->
match(ilayer)) {
1067 static constexpr int widthDisk2Sidentifier = 8;
1070 r =
string(widthDisk2Sidentifier,
'0') + r;
1073 streamsStubRaw[ihit++].emplace_back(seedType, *stub,
valid + stubId + r + phi + rz);
1079 streamsStubRaw[ihit++].emplace_back(seedType, *stub0,
valid + stubId0);
1082 streamsStubRaw[ihit++].emplace_back(seedType, *stub1,
valid + stubId1);
1084 while (ihit < streamsStubRaw.size()) {
1085 streamsStubRaw[ihit++].emplace_back();
Log< level::Info, true > LogVerbatim
const FPGAWord & fpgarinv() const
int chisqzfactbits() const
double tdzcorr(int i, int j) const
int nrinvBitsTable() const
unsigned int maxStep(std::string module) const
double z0dzcorr(int i, int j) const
const FPGAWord & r() const
const Residual & resid(unsigned int layerdisk)
static void calculateDerivatives(Settings const &settings, unsigned int nlayers, double r[N_LAYER], unsigned int ndisks, double z[N_DISK], double alpha[N_DISK], double t, double rinv, double D[N_FITPARAM][N_FITSTUB *2], int iD[N_FITPARAM][N_FITSTUB *2], double MinvDt[N_FITPARAM][N_FITSTUB *2], int iMinvDt[N_FITPARAM][N_FITSTUB *2], double sigma[N_FITSTUB *2], double kfactor[N_FITSTUB *2])
int alphaBitsTable() const
Bit vector used by Track Trigger emulators. Mainly used to convert integers into arbitrary (within ma...
const FPGAWord & fpgastubid() const
void addTrack(Tracklet *tracklet)
std::vector< TrackletParametersMemory * > seedtracklet_
const FPGAWord & fpgaphiresid() const
const FPGAWord & fpgaz0() const
unsigned int nbitsseed() const
const FPGAWord & fpgaphi0() const
Settings const & settings_
bool exactderivatives() const
bool exactderivativesforfloating() const
void trackFitKF(Tracklet *tracklet, std::vector< const Stub *> &trackstublist, std::vector< std::pair< int, int >> &stubidslist)
void trackFitChisq(Tracklet *tracklet, std::vector< const Stub *> &, std::vector< std::pair< int, int >> &)
uint32_t T const *__restrict__ uint32_t const *__restrict__ int32_t int Histo::index_type cudaStream_t stream
const FPGAWord & fpgat() const
void setTrackIndex(int index)
void addOutput(MemoryBase *memory, std::string output) override
int itdzcorr(int i, int j) const
void addStubList(std::vector< const Stub *> stublist)
static std::string to_string(const XMLCh *ch)
int fitz0bitshift() const
static std::string const input
unsigned int isPSmodule() const
TrackFitMemory * trackfit_
std::vector< Tracklet * > orderedMatches(std::vector< FullMatchMemory *> &fullmatch)
std::vector< FullMatchMemory * > fullmatch4_
const FPGAWord & fpgarzresid() const
double phi0approx() const
static double tpar(Settings const &settings, int diskmask, int layermask)
double rmean(unsigned int iLayer) const
double phicritmin() const
const Stub * outerFPGAStub() const
constexpr unsigned int N_TRKLSEED
double stripPitch(bool isPSmodule) const
void addInput(MemoryBase *memory, std::string input) override
void fill(int t, double MinvDt[N_FITPARAM][N_FITSTUB *2], int iMinvDt[N_FITPARAM][N_FITSTUB *2]) const
Abs< T >::type abs(const T &t)
unsigned int nTracks() const
const Stub * middleFPGAStub() const
std::string removalType() const
const TrackDer * getDerivatives(int index) const
std::string const & fitPatternFile() const
const FPGAWord & fpgad0() const
bool writeMonitorData(std::string module) const
double phiresidapprox() const
double zmean(unsigned int iDisk) const
const FPGAWord & stubindex() const
std::vector< FullMatchMemory * > fullmatch1_
double alpha(double pitch) const
bool debugTracklet() const
double rzresidapprox() const
double rinvapprox() const
std::vector< FullMatchMemory * > fullmatch2_
DecomposeProduct< arg, typename Div::arg > D
bool storeTrackBuilderOutput() const
void execute(std::deque< std::string > &streamTrackRaw, std::vector< std::deque< StubStreamData >> &stubStream, unsigned int iSector)
double rinv(double phi1, double phi2, double r1, double r2)
int iz0dzcorr(int i, int j) const
void set(int value, int nbits, bool positive=true, int line=-1, const char *file=nullptr)
constexpr unsigned int N_FITPARAM
void readPatternFile(std::string fileName)
const Stub * stubptr() const
const FPGAWord & alpha() const
bool match(unsigned int layerdisk)
std::ofstream & ofstream(std::string fname)
constexpr unsigned int N_FITSTUB
int fitrinvbitshift() const
void setFitPars(double rinvfit, double phi0fit, double d0fit, double tfit, double z0fit, double chisqrphifit, double chisqrzfit, double rinvfitexact, double phi0fitexact, double d0fitexact, double tfitexact, double z0fitexact, double chisqrphifitexact, double chisqrzfitexact, int irinvfit, int iphi0fit, int id0fit, int itfit, int iz0fit, int ichisqrphifit, int ichisqrzfit, int hitpattern, const std::vector< const L1TStub *> &l1stubs=std::vector< const L1TStub *>())
double phicritmax() const
int chisqphifactbits() const
TrackDerTable *& trackDerTable()
void addStubidsList(std::vector< std::pair< int, int >> stubidslist)
Log< level::Warning, false > LogWarning
const unsigned int kfactor
void trackFitFake(Tracklet *tracklet, std::vector< const Stub *> &, std::vector< std::pair< int, int >> &)
static constexpr float d1
int fitphi0bitshift() const
std::string const & getName() const
std::vector< FullMatchMemory * > fullmatch3_
constexpr unsigned int N_SEED_PROMPT
const Stub * innerFPGAStub() const