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 chisqseed = 0.0;
547 double chisqseedexact = 0.0;
561 for (
unsigned int i = 0;
i <
n;
i++) {
563 iphiresid[
i] *= (
t / ttabi);
564 phiresid[
i] *= (
t / ttab);
565 phiresidexact[
i] *= (
t / ttab);
568 idelta[
j] = iphiresid[
i];
576 deltaexact[
j++] = phiresidexact[
i];
578 idelta[
j] = izresid[
i];
580 deltaexact[
j++] = zresidexact[
i];
583 chisqseedexact += (deltaexact[
j - 2] * deltaexact[
j - 2] + deltaexact[
j - 1] * deltaexact[
j - 1]);
592 double drinvexact = 0.0;
593 double dphi0exact = 0.0;
594 double dtexact = 0.0;
595 double dz0exact = 0.0;
602 double drinv_cov = 0.0;
603 double dphi0_cov = 0.0;
605 double dz0_cov = 0.0;
607 double drinv_covexact = 0.0;
608 double dphi0_covexact = 0.0;
609 double dt_covexact = 0.0;
610 double dz0_covexact = 0.0;
612 for (
unsigned int j = 0;
j < 2 *
n;
j++) {
613 drinv -= MinvDt[0][
j] *
delta[
j];
614 dphi0 -= MinvDt[1][
j] *
delta[
j];
616 dz0 -= MinvDt[3][
j] *
delta[
j];
623 drinvexact -= MinvDt[0][
j] * deltaexact[
j];
624 dphi0exact -= MinvDt[1][
j] * deltaexact[
j];
625 dtexact -= MinvDt[2][
j] * deltaexact[
j];
626 dz0exact -= MinvDt[3][
j] * deltaexact[
j];
628 drinv_covexact +=
D[0][
j] * deltaexact[
j];
629 dphi0_covexact +=
D[1][
j] * deltaexact[
j];
630 dt_covexact +=
D[2][
j] * deltaexact[
j];
631 dz0_covexact +=
D[3][
j] * deltaexact[
j];
633 idrinv += ((iMinvDt[0][
j] * idelta[
j]));
634 idphi0 += ((iMinvDt[1][
j] * idelta[
j]));
635 idt += ((iMinvDt[2][
j] * idelta[
j]));
636 idz0 += ((iMinvDt[3][
j] * idelta[
j]));
638 if (
false &&
j % 2 == 0) {
640 <<
" " << MinvDt[0][
j] <<
" " <<
delta[
j] * rstub[
j / 2] * 10000 <<
" \n" 648 double deltaChisqexact =
649 drinvexact * drinv_covexact + dphi0exact * dphi0_covexact + dtexact * dt_covexact + dz0exact * dz0_covexact;
664 double rinvfit = rinvseed - drinv;
665 double phi0fit = phi0seed - dphi0;
667 double tfit = tseed -
dt;
668 double z0fit = z0seed - dz0;
670 double rinvfitexact = rinvseedexact - drinvexact;
671 double phi0fitexact = phi0seedexact - dphi0exact;
673 double tfitexact = tseedexact - dtexact;
674 double z0fitexact = z0seedexact - dz0exact;
676 double chisqfitexact = chisqseedexact + deltaChisqexact;
679 bool NewChisqDebug =
false;
680 double chisqfit = 0.0;
691 <<
"drinv/cov = " << drinv <<
"/" << drinv_cov <<
" \n" 692 <<
"dphi0/cov = " << drinv <<
"/" << dphi0_cov <<
" \n" 693 <<
"dt/cov = " << drinv <<
"/" << dt_cov <<
" \n" 694 <<
"dz0/cov = " << drinv <<
"/" << dz0_cov <<
"\n";
696 for (
unsigned int i = 0;
i < 2 *
n;
i++) {
703 for (
unsigned int i = 0;
i <
n;
i++) {
705 phifactor = rstub[
k / 2] *
delta[
k] / sigma[
k] +
D[0][
k] * drinv +
D[1][
k] * dphi0 +
D[2][
k] *
dt +
D[3][
k] * dz0;
707 iD[0][
k] * idrinv - iD[1][
k] * idphi0 - iD[2][
k] * idt - iD[3][
k] * idz0;
711 <<
"sum = " << phifactor -
delta[
k] / sigma[
k] <<
" drinvterm = " <<
D[0][
k] * drinv
712 <<
" dphi0term = " <<
D[1][
k] * dphi0 <<
" dtterm = " <<
D[2][
k] *
dt 713 <<
" dz0term = " <<
D[3][
k] * dz0 <<
"\n phifactor = " << phifactor;
716 chisqfit += phifactor * phifactor;
721 rzfactor =
delta[
k] / sigma[
k] +
D[0][
k] * drinv +
D[1][
k] * dphi0 +
D[2][
k] *
dt +
D[3][
k] * dz0;
723 iD[1][
k] * idphi0 - iD[2][
k] * idt - iD[3][
k] * idz0;
727 <<
"sum = " << rzfactor -
delta[
k] / sigma[
k] <<
" drinvterm = " <<
D[0][
k] * drinv
728 <<
" dphi0term = " <<
D[1][
k] * dphi0 <<
" dtterm = " <<
D[2][
k] *
dt 729 <<
" dz0term = " <<
D[3][
k] * dz0 <<
"\n rzfactor = " << rzfactor;
732 chisqfit += rzfactor * rzfactor;
744 if (ichisqfit >= (1 << 15)) {
746 edm::LogVerbatim(
"Tracklet") <<
"CHISQUARE (" << ichisqfit <<
") LARGER THAN 11 BITS!";
748 ichisqfit = (1 << 15) - 1;
752 ichisqfit = ichisqfit >> 7;
754 if (ichisqfit >= (1 << 8))
755 ichisqfit = (1 << 8) - 1;
757 double phicrit = phi0fit - asin(0.5 *
settings_.
rcrit() * rinvfit);
820 std::vector<Tracklet*>
tmp;
822 std::vector<unsigned int> indexArray;
823 for (
auto& imatch : fullmatch) {
825 if (imatch->nMatches() > 1) {
826 for (
unsigned int j = 0;
j < imatch->nMatches() - 1;
j++) {
827 assert(imatch->getTracklet(
j)->TCID() <= imatch->getTracklet(
j + 1)->TCID());
832 edm::LogVerbatim(
"Tracklet") <<
"orderedMatches: " << imatch->getName() <<
" " << imatch->nMatches();
835 indexArray.push_back(0);
842 for (
unsigned int i = 0;
i < fullmatch.size();
i++) {
843 if (indexArray[
i] >= fullmatch[
i]->nMatches()) {
847 int TCID = fullmatch[
i]->getTracklet(indexArray[
i])->TCID();
848 if (TCID < bestTCID || bestTCID < 0) {
853 if (bestIndex != -1) {
854 tmp.push_back(fullmatch[bestIndex]->getTracklet(indexArray[bestIndex]));
855 indexArray[bestIndex]++;
857 }
while (bestIndex != -1);
859 for (
unsigned int i = 0;
i <
tmp.size();
i++) {
863 if (
tmp[
i - 1]->TCID() >
tmp[
i]->TCID()) {
879 vector<deque<StubStreamData>>& streamsStubRaw,
880 unsigned int iSector) {
889 if (
settings_.
debugTracklet() && (matches1.size() + matches2.size() + matches3.size() + matches4.size()) > 0) {
891 edm::LogVerbatim(
"Tracklet") << imatch->getName() <<
" " << imatch->nMatches();
894 << matches3.size() <<
" " << matches4.size();
897 unsigned int indexArray[4];
898 for (
unsigned int i = 0;
i < 4;
i++) {
902 unsigned int countAll = 0;
903 unsigned int countFit = 0;
908 bestTracklet =
nullptr;
910 if (indexArray[0] < matches1.size()) {
911 if (bestTracklet ==
nullptr) {
912 bestTracklet = matches1[indexArray[0]];
914 if (matches1[indexArray[0]]->TCID() < bestTracklet->
TCID())
915 bestTracklet = matches1[indexArray[0]];
919 if (indexArray[1] < matches2.size()) {
920 if (bestTracklet ==
nullptr) {
921 bestTracklet = matches2[indexArray[1]];
923 if (matches2[indexArray[1]]->TCID() < bestTracklet->
TCID())
924 bestTracklet = matches2[indexArray[1]];
928 if (indexArray[2] < matches3.size()) {
929 if (bestTracklet ==
nullptr) {
930 bestTracklet = matches3[indexArray[2]];
932 if (matches3[indexArray[2]]->TCID() < bestTracklet->
TCID())
933 bestTracklet = matches3[indexArray[2]];
937 if (indexArray[3] < matches4.size()) {
938 if (bestTracklet ==
nullptr) {
939 bestTracklet = matches4[indexArray[3]];
941 if (matches4[indexArray[3]]->TCID() < bestTracklet->
TCID())
942 bestTracklet = matches4[indexArray[3]];
946 if (bestTracklet ==
nullptr)
953 int nMatchesUniq = 0;
956 while (indexArray[0] < matches1.size() && matches1[indexArray[0]] == bestTracklet) {
966 while (indexArray[1] < matches2.size() && matches2[indexArray[1]] == bestTracklet) {
976 while (indexArray[2] < matches3.size() && matches3[indexArray[2]] == bestTracklet) {
986 while (indexArray[3] < matches4.size() && matches4[indexArray[3]] == bestTracklet) {
996 edm::LogVerbatim(
"Tracklet") <<
getName() <<
" : nMatches = " << nMatches <<
" nMatchesUniq = " << nMatchesUniq
997 <<
" " << asinh(bestTracklet->
t());
1000 std::vector<const Stub*> trackstublist;
1001 std::vector<std::pair<int, int>> stubidslist;
1004 nMatchesUniq >= 2) {
1009 trackFitFake(bestTracklet, trackstublist, stubidslist);
1011 trackFitKF(bestTracklet, trackstublist, stubidslist);
1015 trackFitFake(bestTracklet, trackstublist, stubidslist);
1026 }
else if (bestTracklet->
fit()) {
1029 ofstream
fout(
"seeds.txt", ofstream::app);
1030 fout << __FILE__ <<
":" << __LINE__ <<
" " <<
name_ <<
"_" 1031 <<
" " << bestTracklet->
getISeed() << endl;
1042 if (!bestTracklet->
fit()) {
1043 static const string invalid =
"0";
1044 streamTrackRaw.emplace_back(invalid);
1045 for (
auto&
stream : streamsStubRaw)
1051 const string phi0 = bestTracklet->
fpgaphi0().
str();
1052 const string z0 = bestTracklet->
fpgaz0().
str();
1053 const string t = bestTracklet->
fpgat().
str();
1054 const int seedType = bestTracklet->
getISeed();
1056 const string valid(
"1");
1057 streamTrackRaw.emplace_back(
valid +
seed +
rinv + phi0 + z0 +
t);
1059 unsigned int ihit(0);
1060 for (
unsigned int ilayer = 0; ilayer <
N_LAYER +
N_DISK; ilayer++) {
1061 if (bestTracklet->
match(ilayer)) {
1064 const string valid(
"1");
1069 static constexpr
int widthDisk2Sidentifier = 8;
1072 r =
string(widthDisk2Sidentifier,
'0') + r;
1074 streamsStubRaw[ihit++].emplace_back(seedType, *stub,
valid + r + phi + rz);
1078 while (ihit < streamsStubRaw.size()) {
1079 streamsStubRaw[ihit++].emplace_back();
Log< level::Info, true > LogVerbatim
const FPGAWord & fpgarinv() const
int chisqzfactbits() const
double tdzcorr(int i, int j) const
const Stub * innerFPGAStub()
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])
const Stub * outerFPGAStub()
int alphaBitsTable() const
Bit vector used by Track Trigger emulators. Mainly used to convert integers into arbitrary (within ma...
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_
std::string to_string(const V &value)
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)
int fitz0bitshift() const
constexpr std::array< uint8_t, layerIndexSize > layer
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
const Stub * middleFPGAStub()
double phi0approx() const
static double tpar(Settings const &settings, int diskmask, int layermask)
double rmean(unsigned int iLayer) const
double phicritmin() 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
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
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