21 #include <unordered_set> 35 unordered_set<string>
outputs = {
"trackout",
53 throw cms::Exception(
"BadConfig") << __FILE__ <<
" " << __LINE__ <<
" could not find output: " <<
output;
61 unordered_set<string>
inputs = {
"trackin",
80 throw cms::Exception(
"BadConfig") << __FILE__ <<
" " << __LINE__ <<
" could not find input: " <<
input;
93 if (inputtrackfit->nTracks() == 0)
95 for (
unsigned int j = 0;
j < inputtrackfit->nTracks();
j++) {
96 Track* aTrack = inputtrackfit->getTrack(
j)->getTrack();
114 std::vector<std::pair<int, bool>> trackInfo;
116 std::vector<bool> trackBinInfo;
118 std::vector<int> seedRank;
121 std::vector<std::vector<const Stub*>> inputstublistsall;
123 std::vector<std::vector<std::pair<int, int>>> mergedstubidslistsall;
124 std::vector<std::vector<std::pair<int, int>>> inputstubidslistsall;
125 std::vector<Tracklet*> inputtrackletsall;
127 std::vector<unsigned int> prefTracks;
128 std::vector<int> prefTrackFit;
142 << __FILE__ <<
" " << __LINE__ <<
" Number of stublists and tracks don't match up! ";
153 std::vector<std::pair<int, int>> stubidslist =
inputtrackfits_[
i]->getStubidslist(
j);
161 const unsigned int curSeed = aTrack->
seedIndex();
162 static const std::vector<int> ranks{1, 5, 2, 7, 4, 3, 8, 6};
163 if (curSeed < ranks.size()) {
164 seedRank.push_back(ranks[curSeed]);
166 seedRank.push_back(9);
168 throw cms::Exception(
"LogError") << __FILE__ <<
" " << __LINE__ <<
" Seed type " << curSeed
169 <<
" not found in list, and settings->extended() not set.";
172 if (stublist.size() != stubidslist.size())
174 << __FILE__ <<
" " << __LINE__ <<
" Number of stubs and stubids don't match up! ";
176 trackInfo.emplace_back(
i,
false);
177 trackBinInfo.emplace_back(
false);
188 for (
unsigned int itrk = 0; itrk < numStublists; itrk++) {
194 bool dupMap[numStublists][numStublists];
195 for (
unsigned int itrk = 0; itrk < numStublists; itrk++) {
196 for (
unsigned int jtrk = 0; jtrk < numStublists; jtrk++) {
197 dupMap[itrk][jtrk] =
false;
202 bool noMerge[numStublists];
203 for (
unsigned int itrk = 0; itrk < numStublists; itrk++) {
204 noMerge[itrk] =
false;
209 for (
unsigned int itrk = 0; itrk < numStublists - 1; itrk++) {
210 for (
unsigned int jtrk = itrk + 1; jtrk < numStublists; jtrk++) {
220 unsigned int nShareLay = 0;
223 for (
auto&
i : layerArr) {
226 for (
const auto& st1 : stubsTrk1) {
227 for (
const auto& st2 : stubsTrk2) {
228 if (st1.first == st2.first && st1.second == st2.second) {
232 bool endcapA = (
i > 10);
233 bool endcapB = (
i < 0);
234 int lay =
barrel * (
i - 1) + endcapA * (
i - 5) - endcapB *
i;
235 if (!layerArr[lay]) {
237 layerArr[lay] =
true;
247 int layStubidsTrk1[16];
248 int layStubidsTrk2[16];
249 for (
int i = 0;
i < 16;
i++) {
250 layStubidsTrk1[
i] = -1;
251 layStubidsTrk2[
i] = -1;
254 for (
unsigned int stcount = 0; stcount < stubsTrk1.size(); stcount++) {
255 int i = stubsTrk1[stcount].first;
257 bool endcapA = (
i > 10);
258 bool endcapB = (
i < 0);
259 int lay =
barrel * (
i - 1) + endcapA * (
i - 5) - endcapB *
i;
262 if (layStubidsTrk1[lay] != -1)
264 if (layStubidsTrk1[lay] == -1 || nres < ores) {
265 layStubidsTrk1[lay] = stcount;
269 for (
unsigned int stcount = 0; stcount < stubsTrk2.size(); stcount++) {
270 int i = stubsTrk2[stcount].first;
272 bool endcapA = (
i > 10);
273 bool endcapB = (
i < 0);
274 int lay =
barrel * (
i - 1) + endcapA * (
i - 5) - endcapB *
i;
277 if (layStubidsTrk2[lay] != -1)
279 if (layStubidsTrk2[lay] == -1 || nres < ores) {
280 layStubidsTrk2[lay] = stcount;
284 for (
int i = 0;
i < 16;
i++) {
285 int t1i = layStubidsTrk1[
i];
286 int t2i = layStubidsTrk2[
i];
287 if (t1i != -1 && t2i != -1 && stubsTrk1[t1i].
first == stubsTrk2[t2i].
first &&
295 dupMap[itrk][jtrk] =
true;
296 dupMap[jtrk][itrk] =
true;
302 for (
unsigned int itrk = 0; itrk < numStublists; itrk++) {
303 for (
unsigned int jtrk = 0; jtrk < numStublists; jtrk++) {
304 if (dupMap[itrk][jtrk]) {
305 noMerge[itrk] =
true;
311 for (
unsigned int itrk = 0; itrk < numStublists; itrk++) {
312 if (noMerge[itrk] ==
false) {
317 trackInfo[itrk].second =
true;
322 for (
unsigned int itrk = 0; itrk < numStublists - 1; itrk++) {
323 for (
unsigned int jtrk = itrk + 1; jtrk < numStublists; jtrk++) {
325 if (dupMap[itrk][jtrk]) {
329 if (seedRank[itrk] < seedRank[jtrk]) {
342 trackBinInfo[preftrk] =
true;
343 trackBinInfo[rejetrk] =
true;
346 std::vector<const Stub*> newStubList;
349 std::vector<unsigned int> stubsTrk1indices;
350 std::vector<unsigned int> stubsTrk2indices;
351 for (
unsigned int stub1it = 0; stub1it < stubsTrk1.size(); stub1it++) {
352 stubsTrk1indices.push_back(stubsTrk1[stub1it]->l1tstub()->
uniqueIndex());
354 for (
unsigned int stub2it = 0; stub2it < stubsTrk2.size(); stub2it++) {
355 stubsTrk2indices.push_back(stubsTrk2[stub2it]->l1tstub()->
uniqueIndex());
357 newStubList = stubsTrk1;
358 for (
unsigned int stub2it = 0; stub2it < stubsTrk2.size(); stub2it++) {
359 if (
find(stubsTrk1indices.begin(), stubsTrk1indices.end(), stubsTrk2indices[stub2it]) ==
360 stubsTrk1indices.end()) {
361 newStubList.push_back(stubsTrk2[stub2it]);
367 std::vector<std::pair<int, int>> newStubidsList;
370 newStubidsList = stubidsTrk1;
372 for (
unsigned int stub2it = 0; stub2it < stubsTrk2.size(); stub2it++) {
373 if (
find(stubsTrk1indices.begin(), stubsTrk1indices.end(), stubsTrk2indices[stub2it]) ==
374 stubsTrk1indices.end()) {
375 newStubidsList.push_back(stubidsTrk2[stub2it]);
382 trackInfo[rejetrk].second =
true;
388 for (
unsigned int ktrk = 0; ktrk < numStublists; ktrk++) {
389 if ((trackInfo[ktrk].
second !=
true) && (trackBinInfo[ktrk] !=
true)) {
390 prefTracks.push_back(ktrk);
391 prefTrackFit.push_back(trackInfo[ktrk].
first);
402 trackBinInfo.clear();
411 for (
unsigned int itrk = 0; itrk < prefTracks.size(); itrk++) {
412 Tracklet* tracklet = inputtrackletsall[itrk];
413 std::vector<const Stub*> trackstublist = inputstublistsall[itrk];
417 hybridFitter.
Fit(tracklet, trackstublist);
420 if (tracklet->
fit()) {
430 outputtracks.push_back(*outtrack);
443 return lhs->
ichisq() / lhs->
stubID().size() < rhs->ichisq() / rhs->stubID().size();
445 bool grid[35][40] = {{
false}};
447 for (
unsigned int itrk = 0; itrk < numTrk; itrk++) {
449 edm::LogPrint(
"Tracklet") <<
"WARNING: Track already tagged as duplicate!!";
464 if (phiTest < -2 *
M_PI / 27)
466 if (phiTest > 2 * 2 *
M_PI / 27)
475 for (
unsigned int itrk = 0; itrk < numTrk - 1; itrk++) {
481 unsigned int nStubP = 0;
482 vector<unsigned int> nStubS(numTrk);
483 vector<unsigned int> nShare(numTrk);
485 std::map<int, int> stubsTrk1 =
inputtracks_[itrk]->stubID();
486 nStubP = stubsTrk1.size();
488 for (
unsigned int jtrk = itrk + 1; jtrk < numTrk; jtrk++) {
494 std::map<int, int> stubsTrk2 =
inputtracks_[jtrk]->stubID();
495 nStubS[jtrk] = stubsTrk2.size();
498 for (
auto& st : stubsTrk1) {
499 if (stubsTrk2.find(st.first) != stubsTrk2.end()) {
500 if (st.second == stubsTrk2[st.first])
507 for (
unsigned int jtrk = itrk + 1; jtrk < numTrk; jtrk++) {
523 edm::LogVerbatim(
"Tracklet") <<
"Error: Didn't tag either track in duplicate pair.";
532 }
else if ((nStubS[jtrk] - nShare[jtrk] <
settings_.
minIndStubs()) && (nStubS[jtrk] <= nStubP)) {
535 edm::LogVerbatim(
"Tracklet") <<
"Error: Didn't tag either track in duplicate pair.";
551 ofstream
fout(
"seeds.txt", ofstream::app);
552 fout << __FILE__ <<
":" << __LINE__ <<
" " <<
name_ <<
"_" << iSector <<
" " 581 int seedindex = curTracklet->
seedIndex();
590 phires =
std::abs(stubphi - phiproj);
595 if ((seedindex == 0 && (
Layer == 1 ||
Layer == 2)) || (seedindex == 1 && (
Layer == 2 ||
Layer == 3)) ||
596 (seedindex == 2 && (
Layer == 3 ||
Layer == 4)) || (seedindex == 3 && (
Layer == 5 ||
Layer == 6)) ||
610 std::pair<int, int> layer_disk;
612 if (layer_disk.first >
N_LAYER) {
613 layer_disk.first = 0;
616 if (layer_disk.second < 0) {
617 layer_disk.second = 0;
624 std::string thestr = Form(
"\t %s stub info: r/z/phi:\t%f\t%f\t%f\t%d\t%f\t%d",
641 double stub_phi = -99;
645 double tracklet_rinv = tracklet->
rinv();
649 stub_phi = tracklet->
phi0() - std::asin(stub_r * tracklet_rinv / 2);
652 stub_z = tracklet->
z0() + 2 * tracklet->
t() * 1 / tracklet_rinv * std::asin(stub_r * tracklet_rinv / 2);
655 stub_phi = tracklet->
phi0() - (stub_z - tracklet->
z0()) * tracklet_rinv / 2 / tracklet->
t();
658 stub_r = 2 / tracklet_rinv *
std::sin((stub_z - tracklet->
z0()) * tracklet_rinv / 2 / tracklet->
t());
661 std::vector<double> invented_coords{stub_r, stub_z, stub_phi};
662 return invented_coords;
671 double stub_phi = -99;
675 const double rho = 1 / tracklet->
rinv();
676 const double rho_minus_d0 = rho + tracklet->
d0();
696 0.5 * (stub_r / rho_minus_d0) + 0.5 * (rho_minus_d0 / stub_r) - 0.5 * ((rho * rho) / (rho_minus_d0 * stub_r));
698 stub_phi = tracklet->
phi0() - std::asin(sin_val);
706 0.5 * (rho / rho_minus_d0) + 0.5 * (rho_minus_d0 / rho) - 0.5 * ((stub_r * stub_r) / (rho * rho_minus_d0));
708 double beta = std::acos(cos_val);
713 double beta = (stub_z - tracklet->
z0()) / (tracklet->
t() *
std::abs(rho));
714 double r_square = -2 * rho * rho_minus_d0 *
std::cos(
beta) + rho * rho + rho_minus_d0 * rho_minus_d0;
715 stub_r =
sqrt(r_square);
721 0.5 * (stub_r / rho_minus_d0) + 0.5 * (rho_minus_d0 / stub_r) - 0.5 * ((rho * rho) / (rho_minus_d0 * stub_r));
723 stub_phi = tracklet->
phi0() - std::asin(sin_val);
729 std::vector<double> invented_coords{stub_r, stub_z, stub_phi};
730 return invented_coords;
734 unsigned int iSector,
const Tracklet* tracklet,
const std::vector<const Stub*>& originalStubsList)
const {
735 std::vector<const Stub*> newStubList;
737 for (
unsigned int stubit = 0; stubit < originalStubsList.size(); stubit++) {
738 const Stub* thisStub = originalStubsList[stubit];
742 std::vector<double> inv_r_z_phi;
748 double stub_x_invent = inv_r_z_phi[0] *
std::cos(inv_r_z_phi[2]);
749 double stub_y_invent = inv_r_z_phi[0] *
std::sin(inv_r_z_phi[2]);
750 double stub_z_invent = inv_r_z_phi[1];
752 Stub* invent_stub_ptr =
new Stub(*thisStub);
754 L1TStub invent_l1stub = *l1stub;
755 invent_l1stub.
setCoords(stub_x_invent, stub_y_invent, stub_z_invent);
761 newStubList.push_back(invent_stub_ptr);
764 newStubList.push_back(thisStub);
783 return rinvBins.size() - 2;
784 else if (
bins == rinvBins.begin())
795 double phi0 = trk->
phi0();
798 double phi = phi0 - asin(0.5 *
rinv * rcrit);
820 std::vector<unsigned int> chosenBins;
821 for (
long unsigned int i = 0;
i < rinvBins.size() - 1;
i++) {
822 if ((
rinv < rinvBins[
i + 1] + rinvOverlapSize) && (
rinv > rinvBins[
i] - rinvOverlapSize)) {
823 chosenBins.push_back(
i);
831 double phi0 = trk->
phi0();
834 double phi = phi0 - asin(0.5 *
rinv * rcrit);
839 std::vector<unsigned int> chosenBins;
840 for (
long unsigned int i = 0;
i <
phiBins.size() - 1;
i++) {
841 if ((phi <
phiBins[
i + 1] + phiOverlapSize) && (phi >
phiBins[
i] - phiOverlapSize)) {
842 chosenBins.push_back(
i);
Log< level::Info, true > LogVerbatim
unsigned int seedIndex() const
unsigned int maxStep(std::string module) const
constexpr T reduceRange(T x)
double rinvOverlapSize() const
std::vector< std::vector< std::pair< int, int > > > inputstubidslists_
double dphisectorHG() const
Sin< T >::type sin(const T &t)
void Fit(Tracklet *tracklet, std::vector< const Stub *> &trackstublist)
Projection & proj(int layerdisk)
Settings const & settings_
double getPhiRes(Tracklet *curTracklet, const Stub *curStub) const
std::vector< CleanTrackMemory * > outputtracklets_
unsigned int minIndStubs() const
void find(edm::Handle< EcalRecHitCollection > &hits, DetId thisDet, std::vector< EcalRecHitCollection::const_iterator > &hit, bool debug=false)
std::vector< Track * > inputtracks_
static std::string const input
SeedingLayerSetsHits::SeedingLayer Layer
U second(std::pair< T, U > const &p)
std::vector< double > getInventedCoords(unsigned int, const Stub *, const Tracklet *) const
const std::vector< double > & phiBins() const
std::vector< double > getInventedCoordsExtended(unsigned int, const Stub *, const Tracklet *) const
std::vector< unsigned int > findOverlapPhiBins(const Tracklet *trk) const
double dphisector() const
double rmean(unsigned int iLayer) const
unsigned int findPhiBin(const Tracklet *trk) const
double phiOverlapSize() const
Cos< T >::type cos(const T &t)
void execute(std::vector< Track > &outputtracks, unsigned int iSector)
Abs< T >::type abs(const T &t)
unsigned int numTracksComparedPerBin() const
std::string removalType() const
std::vector< TrackFitMemory * > inputtrackfits_
bool writeMonitorData(std::string module) const
unsigned int layerdisk() const
void setUniqueIndex(unsigned int index)
double zmean(unsigned int iDisk) const
unsigned int allStubIndex() const
bool isTrackInBin(const std::vector< unsigned int > &vec, unsigned int num) const
std::pair< int, int > findLayerDisk(const Stub *) const
static const TrackGhostTrackState * getTrack(const BasicGhostTrackState *basic)
std::vector< unsigned int > findOverlapRinvBins(const Tracklet *trk) const
double rinv(double phi1, double phi2, double r1, double r2)
void addInput(MemoryBase *memory, std::string input) override
void setCoords(double x, double y, double z)
unsigned int findRinvBin(const Tracklet *trk) const
std::vector< Tracklet * > inputtracklets_
std::vector< std::vector< std::pair< int, int > > > mergedstubidslists_
std::string mergeComparison() const
void addOutput(MemoryBase *memory, std::string output) override
std::vector< const Stub * > getInventedSeedingStub(unsigned int, const Tracklet *, const std::vector< const Stub *> &) const
void setl1tstub(L1TStub *l1tstub)
void setAllStubIndex(unsigned int index)
std::vector< std::vector< const Stub * > > inputstublists_
unsigned int iphi() const
int uniqueIndex(int eta, int phi)
const std::vector< double > & rinvBins() const
std::string l1tinfo(const L1TStub *, std::string) const
bool isSeedingStub(int, int, int) const
void setStubIDprefit(std::vector< std::pair< int, int >> stubIDprefit)
const std::map< int, int > & stubID() const
void setStubIDpremerge(std::vector< std::pair< int, int >> stubIDpremerge)
unsigned int uniqueIndex() const