Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #include "L1Trigger/DTSectorCollector/interface/DTSC.h"
00023
00024
00025
00026
00027 #include "L1TriggerConfig/DTTPGConfig/interface/DTConfigSectColl.h"
00028 #include "L1Trigger/DTSectorCollector/interface/DTSectColl.h"
00029 #include "L1Trigger/DTSectorCollector/interface/DTSectCollPhCand.h"
00030 #include "L1Trigger/DTSectorCollector/interface/DTSectCollThCand.h"
00031
00032
00033
00034
00035 #include <iostream>
00036 #include <algorithm>
00037
00038
00039
00040
00041
00042 DTSC::DTSC(int istat) : _ignoreSecondTrack(0) ,_stat(istat){
00043
00044
00045
00046
00047
00048
00049 }
00050
00051
00052
00053
00054
00055 DTSC::~DTSC() {
00056
00057 clear();
00058
00059 }
00060
00061
00062
00063
00064
00065
00066 void
00067 DTSC::clear() {
00068
00069 _ignoreSecondTrack=0;
00070
00071 for(int itk=0;itk<=1;itk++){
00072
00073 _incand_ph[itk].clear();
00074 }
00075
00076 _outcand_ph.clear();
00077 _cand_th.clear();
00078
00079 }
00080
00081
00082
00083 void
00084 DTSC::run() {
00085
00086 if(config()->debug()){
00087 std::cout << "DTSC::run: Processing DTSectColl: ";
00088 std::cout << nFirstTPh() << " first & " << nSecondTPh() << " second Phi tracks ";
00089 std::cout << " - "<< nCandTh() << " Theta tracks" << std::endl;
00090
00091 }
00092
00093 if(nFirstTPh()<1)return;
00094
00095
00096
00097
00098
00099 if(config()->debug()){
00100 std::cout << "Vector of first Phi tracks in DTSectColl: " << std::endl;
00101 std::vector<DTSectCollPhCand*>::const_iterator p;
00102 for(p=_incand_ph[0].begin(); p!=_incand_ph[0].end(); p++) {
00103 (*p)->print();
00104 }
00105 }
00106
00107
00108 DTSectCollPhCand* first=DTSectCollsort1();
00109 if(config()->debug()){
00110 std::cout << "SC: DTSC::run: first Phi track is = " << first << std::endl;
00111 }
00112 if(first!=0) {
00113 _outcand_ph.push_back(first);
00114
00115 }
00116 if(nSecondTPh()<1)return;
00117
00118
00119
00120
00121
00122
00123 if(config()->debug()){
00124 std::vector<DTSectCollPhCand*>::const_iterator p;
00125 std::cout << "Vector of second Phi tracks in DTSectColl: " << std::endl;
00126 for(p=_incand_ph[1].begin(); p!=_incand_ph[1].end(); p++) {
00127 (*p)->print();
00128 }
00129 }
00130
00131
00132 DTSectCollPhCand* second=DTSectCollsort2();
00133 if(second!=0) {
00134 _outcand_ph.push_back(second);
00135 }
00136
00137 }
00138
00139
00140 DTSectCollPhCand*
00141 DTSC::DTSectCollsort1() {
00142
00143
00144 DTSectCollPhCand* best=0;
00145 DTSectCollPhCand* carry=0;
00146 std::vector<DTSectCollPhCand*>::iterator p;
00147 for(p=_incand_ph[0].begin(); p!=_incand_ph[0].end(); p++) {
00148 DTSectCollPhCand* curr=(*p);
00149
00150 curr->setBitsSectColl();
00151
00152
00153 if(config()->SCGetCarryFlag(_stat)) {
00154
00155 if(best==0){
00156 best=curr;
00157 }
00158 else if((*curr)<(*best)){
00159 carry=best;
00160 best=curr;
00161 }
00162 else if(carry==0){
00163 carry=curr;
00164 }
00165 else if((*curr)<(*carry)){
00166 carry=curr;
00167 }
00168
00169 }
00170 else if(config()->SCGetCarryFlag(_stat)==0){
00171 if(best==0){
00172 best=curr;
00173 }
00174 else if((*curr)<(*best)){
00175
00176 best=curr;
00177 }
00178
00179 }
00180
00181 if(carry!=0 && config()->SCGetCarryFlag(_stat)) {
00182 carry->setSecondTrack();
00183 _incand_ph[1].push_back(carry);
00184
00185 }
00186 }
00187
00188 return best;
00189
00190 }
00191
00192
00193 DTSectCollPhCand*
00194 DTSC::DTSectCollsort2() {
00195
00196
00197
00198 if(nTracksPh()<1){
00199 std::cout << "DTSC::DTSectCollsort2: called with no first Phi track.";
00200 std::cout << " empty pointer returned!" << std::endl;
00201 return 0;
00202 }
00203
00204 if(_ignoreSecondTrack){
00205
00206 for(std::vector<DTSectCollPhCand*>::iterator p=_incand_ph[1].begin(); p!=_incand_ph[1].end(); p++) {
00207
00208 }
00209 return 0;
00210 }
00211
00212
00213
00214 DTSectCollPhCand* second=0;
00215 std::vector<DTSectCollPhCand*>::iterator p;
00216 for(p=_incand_ph[1].begin(); p!=_incand_ph[1].end(); p++) {
00217 DTSectCollPhCand* curr=(*p);
00218 curr->setBitsSectColl();
00219
00220 if(second==0){
00221 second=curr;
00222 }
00223 else if((*curr)<(*second)){
00224 second=curr;
00225 }
00226
00227 }
00228
00229 return second;
00230
00231 }
00232
00233
00234 void
00235 DTSC::addPhCand(DTSectCollPhCand* cand) {
00236
00237 _incand_ph[(1-cand->isFirst())].push_back(cand);
00238
00239 }
00240
00241 void
00242 DTSC::addThCand(DTSectCollThCand* cand) {
00243
00244 _cand_th.push_back(cand);
00245
00246 }
00247
00248
00249 unsigned
00250 DTSC::nCandPh(int ifs) const {
00251
00252 if(ifs<1||ifs>2){
00253 std::cout << "DTSC::nCandPh: wrong track number: " << ifs;
00254 std::cout << " 0 returned!" << std::endl;
00255 return 0;
00256 }
00257 return _incand_ph[ifs-1].size();
00258
00259 }
00260
00261 unsigned
00262 DTSC::nCandTh() const {
00263
00264 return _cand_th.size();
00265
00266 }
00267
00268
00269 DTSectCollPhCand*
00270 DTSC::getDTSectCollPhCand(int ifs, unsigned n) const {
00271
00272 if(ifs<1||ifs>2){
00273 std::cout << "DTSC::getDTSectCollPhCand: wrong track number: " << ifs;
00274 std::cout << " empty pointer returned!" << std::endl;
00275 return 0;
00276 }
00277 if(n<1 || n>nCandPh(ifs)) {
00278 std::cout << "DTSC::getDTSectCollPhCand: requested trigger not present: " << n;
00279 std::cout << " empty pointer returned!" << std::endl;
00280 return 0;
00281 }
00282
00283 std::vector<DTSectCollPhCand*>::const_iterator p = _incand_ph[ifs-1].begin()+n-1;
00284 return (*p);
00285
00286 }
00287
00288 DTSectCollThCand*
00289 DTSC::getDTSectCollThCand(unsigned n) const {
00290
00291 if(n<1 || n>nCandTh()) {
00292 std::cout << "DTSC::getDTSectCollThCand: requested trigger not present: " << n;
00293 std::cout << " empty pointer returned!" << std::endl;
00294 return 0;
00295 }
00296
00297 std::vector<DTSectCollThCand*>::const_iterator p = _cand_th.begin()+n-1;
00298 return (*p);
00299
00300 }
00301
00302 void
00303 DTSC::addDTSectCollPhCand(DTSectCollPhCand* cand) {
00304
00305 int ifs = (cand->isFirst()) ? 0 : 1;
00306
00307 _incand_ph[ifs].push_back(cand);
00308
00309 }
00310
00311 DTSectCollPhCand*
00312 DTSC::getTrackPh(int n) const {
00313
00314 if(n<1 || n>nTracksPh()) {
00315 std::cout << "DTSC::getTrackPh: requested track not present: " << n;
00316 std::cout << " empty pointer returned!" << std::endl;
00317 return 0;
00318 }
00319
00320 std::vector<DTSectCollPhCand*>::const_iterator p = _outcand_ph.begin()+n-1;
00321
00322 return (*p);
00323
00324 }
00325
00326
00327 DTSectCollThCand*
00328 DTSC::getTrackTh(int n) const {
00329
00330 if(n<1 || n>nTracksTh()) {
00331 std::cout << "DTSC::getTrackTh: requested track not present: " << n;
00332 std::cout << " empty pointer returned!" << std::endl;
00333 return 0;
00334 }
00335
00336 std::vector<DTSectCollThCand*>::const_iterator p = _cand_th.begin()+n-1;
00337
00338 return (*p);
00339
00340 }