22 if (
output ==
"trackout") {
29 throw cms::Exception(
"BadConfig") << __FILE__ <<
" " << __LINE__ <<
" addOutput, output = " <<
output <<
" not known";
37 if (
input.substr(0, 4) ==
"tpar") {
43 if (
input.substr(0, 10) ==
"fullmatch1") {
49 if (
input.substr(0, 10) ==
"fullmatch2") {
55 if (
input.substr(0, 10) ==
"fullmatch3") {
61 if (
input.substr(0, 10) ==
"fullmatch4") {
68 throw cms::Exception(
"BadConfig") << __FILE__ <<
" " << __LINE__ <<
" input = " <<
input <<
" not found";
73 std::vector<const Stub*>& trackstublist,
86 for (
unsigned int j = 0;
j <
i->nMatches();
j++) {
87 if (
i->getTracklet(
j)->TCID() == tracklet->
TCID()) {
88 trackstublist.push_back(
i->getMatch(
j).second);
94 for (
unsigned int j = 0;
j <
i->nMatches();
j++) {
95 if (
i->getTracklet(
j)->TCID() == tracklet->
TCID()) {
96 trackstublist.push_back(
i->getMatch(
j).second);
102 for (
unsigned int j = 0;
j <
i->nMatches();
j++) {
103 if (
i->getTracklet(
j)->TCID() == tracklet->
TCID()) {
104 trackstublist.push_back(
i->getMatch(
j).second);
110 for (
unsigned int j = 0;
j <
i->nMatches();
j++) {
111 if (
i->getTracklet(
j)->TCID() == tracklet->
TCID()) {
112 trackstublist.push_back(
i->getMatch(
j).second);
119 for (
const auto& it : trackstublist) {
120 int layer = it->layer().value() + 1;
121 if (it->layer().value() < 0) {
122 layer = it->disk().value() + 10 * it->disk().value() /
abs(it->disk().value());
124 stubidslist.push_back(std::make_pair(
layer, it->phiregionaddress()));
132 hybridFitter.Fit(tracklet, trackstublist);
160 unsigned int ndisks = 0;
178 phiresidexact[
i] = 0.0;
179 zresidexact[
i] = 0.0;
182 std::bitset<N_LAYER> lmatches;
183 std::bitset<N_DISK * 2> dmatches;
187 unsigned int layermask = 0;
188 unsigned int diskmask = 0;
189 unsigned int alphaindex = 0;
190 unsigned int power = 1;
192 double t = tracklet->
t();
197 if (
l == (
unsigned int)tracklet->
layer() ||
l == (
unsigned int)tracklet->
layer() + 1) {
203 if (tracklet->
match(
l - 1)) {
218 for (
unsigned int d = 1;
d <=
N_DISK;
d++) {
219 if (layermask & (1 << (
d - 1)))
231 dmatches.set(2 *
d - 1);
232 diskmask |= (1 << (2 * (
N_DISK -
d) + 1));
239 alphaindex += ialpha * power;
241 dmatches.set(2 * (
N_DISK -
d));
242 diskmask |= (1 << (2 * (
N_DISK -
d)));
260 << lmatches.to_string() <<
" " << dmatches.to_string() <<
" " <<
mult << endl;
266 for (
unsigned int l = 1;
l <= 2;
l++) {
267 if (tracklet->
match(
l - 1)) {
287 if (
d == 5 and layermask & (1 << 4))
293 dmatches.set(2 *
d1 - 1);
294 diskmask |= (1 << (2 * (
N_DISK -
d1) + 1));
306 dmatches.set(2 *
d1 - 1);
307 diskmask |= (1 << (2 * (
N_DISK -
d1) + 1));
314 alphaindex += ialpha * power;
317 diskmask |= (1 << (2 * (
N_DISK -
d1)));
337 for (
unsigned int l = 1;
l <= 2;
l++) {
338 if (
l == (
unsigned int)tracklet->
layer()) {
344 if (tracklet->
match(
l - 1)) {
367 if (
d == tracklet->
disk()) {
369 dmatches.set(2 *
d1 - 1);
370 diskmask |= (1 << (2 * (
N_DISK -
d1) + 1));
382 diskmask |= (1 << (2 * (
N_DISK -
d1) + 1));
384 tmp.set(diskmask, 10);
391 alphaindex += ialpha * power;
394 diskmask |= (1 << (2 * (
N_DISK -
d1)));
396 tmp.set(diskmask, 10);
424 if (derivatives ==
nullptr) {
427 tmpl.set(layermask, 6);
428 tmpd.
set(diskmask, 10);
429 edm::LogVerbatim(
"Tracklet") <<
"No derivative for layermask, diskmask : " << layermask <<
" " <<
tmpl.str()
430 <<
" " << diskmask <<
" " << tmpd.
str() <<
" eta = " << asinh(
t);
474 for (
unsigned i = 0;
i < ndisks;
i++) {
490 settings_,
nlayers,
r, ndisks, z,
alpha,
t,
rinv,
D, iD, MinvDt, iMinvDt, sigma,
kfactor);
496 settings_,
nlayers,
r, ndisks, z,
alpha,
t,
rinv,
D, iD, MinvDt, iMinvDt, sigma,
kfactor);
499 derivatives->
fill(tracklet->
fpgat().
value(), MinvDtDummy, iMinvDt);
517 double dr = realrstub[
i] -
r[
i];
519 MinvDt[2][2 *
ii + 1] +=
dr * tder;
520 MinvDt[3][2 *
ii + 1] +=
dr * zder;
535 double tseed = tracklet->
tapprox();
536 double z0seed = tracklet->
z0approx();
538 double rinvseedexact = tracklet->
rinv();
539 double phi0seedexact = tracklet->
phi0();
540 double tseedexact = tracklet->
t();
541 double z0seedexact = tracklet->
z0();
543 double chisqseed = 0.0;
544 double chisqseedexact = 0.0;
558 for (
unsigned int i = 0;
i <
n;
i++) {
560 iphiresid[
i] *= (
t / ttabi);
561 phiresid[
i] *= (
t / ttab);
562 phiresidexact[
i] *= (
t / ttab);
565 idelta[
j] = iphiresid[
i];
573 deltaexact[
j++] = phiresidexact[
i];
575 idelta[
j] = izresid[
i];
577 deltaexact[
j++] = zresidexact[
i];
580 chisqseedexact += (deltaexact[
j - 2] * deltaexact[
j - 2] + deltaexact[
j - 1] * deltaexact[
j - 1]);
589 double drinvexact = 0.0;
590 double dphi0exact = 0.0;
591 double dtexact = 0.0;
592 double dz0exact = 0.0;
599 double drinv_cov = 0.0;
600 double dphi0_cov = 0.0;
602 double dz0_cov = 0.0;
604 double drinv_covexact = 0.0;
605 double dphi0_covexact = 0.0;
606 double dt_covexact = 0.0;
607 double dz0_covexact = 0.0;
609 for (
unsigned int j = 0;
j < 2 *
n;
j++) {
610 drinv -= MinvDt[0][
j] *
delta[
j];
611 dphi0 -= MinvDt[1][
j] *
delta[
j];
613 dz0 -= MinvDt[3][
j] *
delta[
j];
620 drinvexact -= MinvDt[0][
j] * deltaexact[
j];
621 dphi0exact -= MinvDt[1][
j] * deltaexact[
j];
622 dtexact -= MinvDt[2][
j] * deltaexact[
j];
623 dz0exact -= MinvDt[3][
j] * deltaexact[
j];
625 drinv_covexact +=
D[0][
j] * deltaexact[
j];
626 dphi0_covexact +=
D[1][
j] * deltaexact[
j];
627 dt_covexact +=
D[2][
j] * deltaexact[
j];
628 dz0_covexact +=
D[3][
j] * deltaexact[
j];
630 idrinv += ((iMinvDt[0][
j] * idelta[
j]));
631 idphi0 += ((iMinvDt[1][
j] * idelta[
j]));
632 idt += ((iMinvDt[2][
j] * idelta[
j]));
633 idz0 += ((iMinvDt[3][
j] * idelta[
j]));
635 if (
false &&
j % 2 == 0) {
637 <<
" " << MinvDt[0][
j] <<
" " <<
delta[
j] * rstub[
j / 2] * 10000 <<
" \n" 645 double deltaChisqexact =
646 drinvexact * drinv_covexact + dphi0exact * dphi0_covexact + dtexact * dt_covexact + dz0exact * dz0_covexact;
661 double rinvfit = rinvseed - drinv;
662 double phi0fit = phi0seed - dphi0;
664 double tfit = tseed -
dt;
665 double z0fit = z0seed - dz0;
667 double rinvfitexact = rinvseedexact - drinvexact;
668 double phi0fitexact = phi0seedexact - dphi0exact;
670 double tfitexact = tseedexact - dtexact;
671 double z0fitexact = z0seedexact - dz0exact;
673 double chisqfitexact = chisqseedexact + deltaChisqexact;
676 bool NewChisqDebug =
false;
677 double chisqfit = 0.0;
688 <<
"drinv/cov = " << drinv <<
"/" << drinv_cov <<
" \n" 689 <<
"dphi0/cov = " << drinv <<
"/" << dphi0_cov <<
" \n" 690 <<
"dt/cov = " << drinv <<
"/" << dt_cov <<
" \n" 691 <<
"dz0/cov = " << drinv <<
"/" << dz0_cov <<
"\n";
693 for (
unsigned int i = 0;
i < 2 *
n;
i++) {
700 for (
unsigned int i = 0;
i <
n;
i++) {
702 phifactor = rstub[
k / 2] *
delta[
k] / sigma[
k] +
D[0][
k] * drinv +
D[1][
k] * dphi0 +
D[2][
k] *
dt +
D[3][
k] * dz0;
704 iD[0][
k] * idrinv - iD[1][
k] * idphi0 - iD[2][
k] * idt - iD[3][
k] * idz0;
708 <<
"sum = " << phifactor -
delta[
k] / sigma[
k] <<
" drinvterm = " <<
D[0][
k] * drinv
709 <<
" dphi0term = " <<
D[1][
k] * dphi0 <<
" dtterm = " <<
D[2][
k] *
dt 710 <<
" dz0term = " <<
D[3][
k] * dz0 <<
"\n phifactor = " << phifactor;
713 chisqfit += phifactor * phifactor;
718 rzfactor =
delta[
k] / sigma[
k] +
D[0][
k] * drinv +
D[1][
k] * dphi0 +
D[2][
k] *
dt +
D[3][
k] * dz0;
720 iD[1][
k] * idphi0 - iD[2][
k] * idt - iD[3][
k] * idz0;
724 <<
"sum = " << rzfactor -
delta[
k] / sigma[
k] <<
" drinvterm = " <<
D[0][
k] * drinv
725 <<
" dphi0term = " <<
D[1][
k] * dphi0 <<
" dtterm = " <<
D[2][
k] *
dt 726 <<
" dz0term = " <<
D[3][
k] * dz0 <<
"\n rzfactor = " << rzfactor;
729 chisqfit += rzfactor * rzfactor;
741 if (ichisqfit >= (1 << 15)) {
743 edm::LogVerbatim(
"Tracklet") <<
"CHISQUARE (" << ichisqfit <<
") LARGER THAN 11 BITS!";
745 ichisqfit = (1 << 15) - 1;
749 ichisqfit = ichisqfit >> 7;
751 if (ichisqfit >= (1 << 8))
752 ichisqfit = (1 << 8) - 1;
754 double phicrit = phi0fit - asin(0.5 *
settings_.
rcrit() * rinvfit);
817 std::vector<Tracklet*>
tmp;
819 std::vector<unsigned int> indexArray;
820 for (
auto& imatch : fullmatch) {
822 if (imatch->nMatches() > 1) {
823 for (
unsigned int j = 0;
j < imatch->nMatches() - 1;
j++) {
824 assert(imatch->getTracklet(
j)->TCID() <= imatch->getTracklet(
j + 1)->TCID());
829 edm::LogVerbatim(
"Tracklet") <<
"orderedMatches: " << imatch->getName() <<
" " << imatch->nMatches();
832 indexArray.push_back(0);
839 for (
unsigned int i = 0;
i < fullmatch.size();
i++) {
840 if (indexArray[
i] >= fullmatch[
i]->nMatches()) {
844 int TCID = fullmatch[
i]->getTracklet(indexArray[
i])->TCID();
845 if (TCID < bestTCID || bestTCID < 0) {
850 if (bestIndex != -1) {
851 tmp.push_back(fullmatch[bestIndex]->getTracklet(indexArray[bestIndex]));
852 indexArray[bestIndex]++;
854 }
while (bestIndex != -1);
856 for (
unsigned int i = 0;
i <
tmp.size();
i++) {
860 if (
tmp[
i - 1]->TCID() >
tmp[
i]->TCID()) {
879 if (
settings_.
debugTracklet() && (matches1.size() + matches2.size() + matches3.size() + matches4.size()) > 0) {
881 edm::LogVerbatim(
"Tracklet") << imatch->getName() <<
" " << imatch->nMatches();
884 << matches3.size() <<
" " << matches4.size();
887 unsigned int indexArray[4];
888 for (
unsigned int i = 0;
i < 4;
i++) {
898 bestTracklet =
nullptr;
900 if (indexArray[0] < matches1.size()) {
901 if (bestTracklet ==
nullptr) {
902 bestTracklet = matches1[indexArray[0]];
904 if (matches1[indexArray[0]]->TCID() < bestTracklet->
TCID())
905 bestTracklet = matches1[indexArray[0]];
909 if (indexArray[1] < matches2.size()) {
910 if (bestTracklet ==
nullptr) {
911 bestTracklet = matches2[indexArray[1]];
913 if (matches2[indexArray[1]]->TCID() < bestTracklet->
TCID())
914 bestTracklet = matches2[indexArray[1]];
918 if (indexArray[2] < matches3.size()) {
919 if (bestTracklet ==
nullptr) {
920 bestTracklet = matches3[indexArray[2]];
922 if (matches3[indexArray[2]]->TCID() < bestTracklet->
TCID())
923 bestTracklet = matches3[indexArray[2]];
927 if (indexArray[3] < matches4.size()) {
928 if (bestTracklet ==
nullptr) {
929 bestTracklet = matches4[indexArray[3]];
931 if (matches4[indexArray[3]]->TCID() < bestTracklet->
TCID())
932 bestTracklet = matches4[indexArray[3]];
936 if (bestTracklet ==
nullptr)
943 int nMatchesUniq = 0;
946 while (indexArray[0] < matches1.size() && matches1[indexArray[0]] == bestTracklet) {
956 while (indexArray[1] < matches2.size() && matches2[indexArray[1]] == bestTracklet) {
966 while (indexArray[2] < matches3.size() && matches3[indexArray[2]] == bestTracklet) {
976 while (indexArray[3] < matches4.size() && matches4[indexArray[3]] == bestTracklet) {
986 edm::LogVerbatim(
"Tracklet") <<
getName() <<
" : nMatches = " << nMatches <<
" nMatchesUniq = " << nMatchesUniq
987 <<
" " << asinh(bestTracklet->
t());
990 std::vector<const Stub*> trackstublist;
991 std::vector<std::pair<int, int>> stubidslist;
997 trackFitKF(bestTracklet, trackstublist, stubidslist);
1000 trackFitFake(bestTracklet, trackstublist, stubidslist);
1011 }
else if (bestTracklet->
fit()) {
1014 ofstream
fout(
"seeds.txt", ofstream::app);
1015 fout << __FILE__ <<
":" << __LINE__ <<
" " <<
name_ <<
"_" 1016 <<
" " << bestTracklet->
getISeed() << endl;
1024 }
while (bestTracklet !=
nullptr);
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
double z0dzcorr(int i, int j) 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
void addTrack(Tracklet *tracklet)
std::vector< TrackletParametersMemory * > seedtracklet_
const FPGAWord & fpgaphiresid() const
const FPGAWord & fpgaz0() 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 >> &)
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
void execute(unsigned int iSector)
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
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()
std::pair< typename Association::data_type::first_type, double > match(Reference key, Association association, bool bestMatchByMaxValue)
Generic matching function.
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