12 using namespace trklet;
15 :
ProcessBase(name, settings, global), trackfit_(nullptr) {}
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) {
200 layers[nlayers++] =
l;
203 if (tracklet->
match(
l - 1)) {
214 layers[nlayers++] =
l;
218 for (
unsigned int d = 1;
d <=
N_DISK;
d++) {
219 if (layermask & (1 << (
d - 1)))
225 if (ndisks + nlayers >= N_FITSTUB)
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)));
248 phiresidexact[nlayers + ndisks] = resid.
phiresid();
249 zresidexact[nlayers + ndisks] = resid.
rzresid();
260 << lmatches.to_string() <<
" " << dmatches.to_string() <<
" " << mult << endl;
266 for (
unsigned int l = 1;
l <= 2;
l++) {
267 if (tracklet->
match(
l - 1)) {
279 layers[nlayers++] =
l;
287 if (d == 5 and layermask & (1 << 4))
293 dmatches.set(2 *
d1 - 1);
294 diskmask |= (1 << (2 * (
N_DISK -
d1) + 1));
300 if (ndisks + nlayers >= N_FITSTUB)
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)));
326 phiresidexact[nlayers + ndisks] = resid.
phiresid();
327 zresidexact[nlayers + ndisks] = resid.
rzresid();
337 for (
unsigned int l = 1;
l <= 2;
l++) {
338 if (
l == (
unsigned int)tracklet->
layer()) {
341 layers[nlayers++] =
l;
344 if (tracklet->
match(
l - 1)) {
357 layers[nlayers++] =
l;
367 if (d == tracklet->
disk()) {
368 disks[ndisks] = tracklet->
disk();
369 dmatches.set(2 *
d1 - 1);
370 diskmask |= (1 << (2 * (
N_DISK -
d1) + 1));
375 if (ndisks + nlayers >= N_FITSTUB)
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);
405 phiresidexact[nlayers + ndisks] = resid.
phiresid();
406 zresidexact[nlayers + ndisks] = resid.
rzresid();
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);
457 if (layers[
i] == tracklet->
layer()) {
464 if (layers[
i] == tracklet->
layer() + 1) {
467 if (tracklet->
match(layers[
i] - 1) && layers[
i] < 4) {
474 for (
unsigned i = 0;
i < ndisks;
i++) {
483 double sigma[N_FITSTUB * 2];
486 unsigned int n = nlayers + ndisks;
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);
498 double MinvDtDummy[
N_FITPARAM][N_FITSTUB * 2];
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];
566 delta[
j] = phiresid[
i];
573 deltaexact[j++] = phiresidexact[
i];
575 idelta[
j] = izresid[
i];
576 delta[
j] = zresid[
i];
577 deltaexact[j++] = zresidexact[
i];
579 chisqseed += (delta[j - 2] * delta[j - 2] + delta[j - 1] * delta[j - 1]);
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];
612 dt -= MinvDt[2][
j] * delta[
j];
613 dz0 -= MinvDt[3][
j] * delta[
j];
615 drinv_cov += D[0][
j] * delta[
j];
616 dphi0_cov += D[1][
j] * delta[
j];
617 dt_cov += D[2][
j] * delta[
j];
618 dz0_cov += D[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) {
636 edm::LogVerbatim(
"Tracklet") <<
"DEBUG CHI2FIT " << j <<
" " << rinvseed <<
" + " << MinvDt[0][
j] * delta[
j]
637 <<
" " << MinvDt[0][
j] <<
" " << delta[
j] * rstub[j / 2] * 10000 <<
" \n"
641 << idelta[
j] *
settings_.
kphi() * rstub[j / 2] * 10000 <<
" " << idelta[
j];
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++) {
694 myout += std::to_string(D[0][
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;
707 edm::LogVerbatim(
"Tracklet") <<
"delta[k]/sigma = " << delta[
k] / sigma[
k] <<
" delta[k] = " << delta[
k] <<
"\n"
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;
723 edm::LogVerbatim(
"Tracklet") <<
"delta[k]/sigma = " << delta[
k] / sigma[
k] <<
" delta[k] = " << delta[
k] <<
"\n"
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()) {
872 const std::vector<Tracklet*>& matches1 =
orderedMatches(fullmatch1_);
873 const std::vector<Tracklet*>& matches2 =
orderedMatches(fullmatch2_);
874 const std::vector<Tracklet*>& matches3 =
orderedMatches(fullmatch3_);
875 const std::vector<Tracklet*>& matches4 =
orderedMatches(fullmatch4_);
879 if (
settings_.
debugTracklet() && (matches1.size() + matches2.size() + matches3.size() + matches4.size()) > 0) {
880 for (
auto& imatch : fullmatch1_) {
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);
int iz0dzcorr(int i, int j) const
Log< level::Info, true > LogVerbatim
const FPGAWord & fpgat() const
const Stub * innerFPGAStub()
std::vector< LayerSetAndLayers > layers(const SeedingLayerSetsHits &sets)
bool exactderivatives() 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()
double phiresidapprox() const
int fitrinvbitshift() const
const FPGAWord & fpgaphi0() const
void addTrack(Tracklet *tracklet)
void trackFitKF(Tracklet *tracklet, std::vector< const Stub * > &trackstublist, std::vector< std::pair< int, int >> &stubidslist)
bool exactderivativesforfloating() const
std::vector< TrackletParametersMemory * > seedtracklet_
const Stub * stubptr() const
double rzresidapprox() const
void fill(int t, double MinvDt[N_FITPARAM][N_FITSTUB *2], int iMinvDt[N_FITPARAM][N_FITSTUB *2]) const
Settings const & settings_
double phi0approx() const
void setTrackIndex(int index)
void addOutput(MemoryBase *memory, std::string output) override
std::string const & fitPatternFile() const
void addStubList(std::vector< const Stub * > stublist)
std::vector< Tracklet * > orderedMatches(std::vector< FullMatchMemory * > &fullmatch)
bool debugTracklet() const
double tdzcorr(int i, int j) 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 * >())
constexpr std::array< uint8_t, layerIndexSize > layer
static std::string const input
TrackFitMemory * trackfit_
double phicritmax() const
double rmean(unsigned int iLayer) const
std::vector< FullMatchMemory * > fullmatch4_
std::string const & getName() const
double zmean(unsigned int iDisk) const
const Stub * middleFPGAStub()
std::string const & getName() const
static double tpar(Settings const &settings, int diskmask, int layermask)
int fitz0bitshift() const
constexpr unsigned int N_TRKLSEED
double alpha(double pitch) const
void addInput(MemoryBase *memory, std::string input) override
int alphaBitsTable() const
Abs< T >::type abs(const T &t)
unsigned int nTracks() const
void execute(unsigned int iSector)
int chisqzfactbits() const
unsigned int isPSmodule() const
std::vector< FullMatchMemory * > fullmatch1_
const FPGAWord & fpgarzresid() const
void trackFitChisq(Tracklet *tracklet, std::vector< const Stub * > &, std::vector< std::pair< int, int >> &)
std::vector< FullMatchMemory * > fullmatch2_
DecomposeProduct< arg, typename Div::arg > D
std::string removalType() const
double rinv(double phi1, double phi2, double r1, double r2)
const TrackDer * getDerivatives(int index) const
int itdzcorr(int i, int j) const
void set(int value, int nbits, bool positive=true, int line=-1, const char *file=nullptr)
const FPGAWord & fpgarinv() const
constexpr unsigned int N_FITPARAM
int fitphi0bitshift() const
void readPatternFile(std::string fileName)
double phicritmin() const
const FPGAWord & fpgaz0() const
const FPGAWord & alpha() const
bool match(unsigned int layerdisk)
std::ofstream & ofstream(std::string fname)
constexpr unsigned int N_FITSTUB
TrackDerTable *& trackDerTable()
double z0dzcorr(int i, int j) const
void trackFitFake(Tracklet *tracklet, std::vector< const Stub * > &, std::vector< std::pair< int, int >> &)
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)
const FPGAWord & fpgaphiresid() const
Log< level::Warning, false > LogWarning
const unsigned int kfactor
static constexpr float d1
double stripPitch(bool isPSmodule) const
std::vector< FullMatchMemory * > fullmatch3_
const FPGAWord & fpgad0() const
int chisqphifactbits() const
double rinvapprox() const
int nrinvBitsTable() const
bool writeMonitorData(std::string module) const
constexpr unsigned int N_SEED_PROMPT