22 if (
output ==
"trackout") {
29 throw cms::Exception(
"BadConfig") << __FILE__ <<
" " << __LINE__ <<
" addOutput, output = " <<
output <<
" not known";
37 if (
input.substr(0, 4) ==
"tpar") {
38 auto*
tmp = dynamic_cast<TrackletParametersMemory*>(
memory);
43 if (
input.substr(0, 10) ==
"fullmatch1") {
44 auto*
tmp = dynamic_cast<FullMatchMemory*>(
memory);
49 if (
input.substr(0, 10) ==
"fullmatch2") {
50 auto*
tmp = dynamic_cast<FullMatchMemory*>(
memory);
55 if (
input.substr(0, 10) ==
"fullmatch3") {
56 auto*
tmp = dynamic_cast<FullMatchMemory*>(
memory);
61 if (
input.substr(0, 10) ==
"fullmatch4") {
62 auto*
tmp = dynamic_cast<FullMatchMemory*>(
memory);
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++) {
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;
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);