00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #include "L1Trigger/DTTriggerServerTheta/interface/DTTSTheta.h"
00021
00022
00023
00024
00025 #include "L1Trigger/DTTriggerServerTheta/interface/DTChambThSegm.h"
00026 #include "L1Trigger/DTBti/interface/DTBtiCard.h"
00027 #include "L1Trigger/DTBti/interface/DTBtiTrigData.h"
00028
00029
00030
00031
00032 #include <iostream>
00033
00034
00035
00036
00037 DTTSTheta::DTTSTheta(DTTrigGeom* geom, DTBtiCard* bticard) :
00038 DTGeomSupplier(geom), _bticard(bticard) {
00039
00040 for(int i=0;i<DTConfigTSTheta::NSTEPL-DTConfigTSTheta::NSTEPF+1;i++){
00041 _trig[i].zero();
00042 _Htrig[i].zero();
00043 _ntrig[i] = 0;
00044 _nHtrig[i] = 0;
00045 }
00046
00047 }
00048
00049
00050
00051
00052
00053 DTTSTheta::~DTTSTheta(){
00054
00055 }
00056
00057
00058
00059
00060
00061
00062 void
00063 DTTSTheta::localClear() {
00064 for(int is=0;is<DTConfigTSTheta::NSTEPL-DTConfigTSTheta::NSTEPF+1;is++){
00065
00066 _trig[is].zero();
00067 _Htrig[is].zero();
00068 _ntrig[is] = 0;
00069 _nHtrig[is] = 0;
00070 }
00071 }
00072
00073 void
00074 DTTSTheta::setConfig(const DTConfigManager *conf){
00075
00076 DTChamberId sid = ChamberId();
00077 _config = conf->getDTConfigTSTheta(sid);
00078
00079 }
00080
00081 void
00082 DTTSTheta::loadDTTSTheta() {
00083 localClear();
00084 if(station()==4)return;
00085
00086 if(config()->debug()){
00087 std::cout << "DTTSTheta::loadDTTSTheta called for wheel=" << wheel() ;
00088 std::cout << ", station=" << station();
00089 std::cout << ", sector=" << sector() << std::endl;
00090 }
00091
00092
00093 std::vector<DTBtiTrigData>::const_iterator p;
00094 std::vector<DTBtiTrigData>::const_iterator pend=_bticard->end();
00095 for(p=_bticard->begin();p!=pend;p++){
00096
00097 if (p->btiSL() == 2) {
00098
00099 int step = p->step();
00100 add_btiT( step, &(*p) );
00101 }
00102 }
00103
00104 }
00105
00106 void
00107 DTTSTheta::add_btiT(int step, const DTBtiTrigData* btitrig){
00108 int n = btitrig->btiNumber();
00109
00110
00111
00112
00113
00114
00115
00116
00117
00118
00119
00120
00121
00122 if( n<1 || n>geom()->nCell(2) ) {
00123 std::cout << "DTTSTheta::add_btiT: BTI out of range: " << n;
00124 std::cout << " trigger not added!" << std::endl;
00125 return;
00126 }
00127 if(step<DTConfigTSTheta::NSTEPF||step>DTConfigTSTheta::NSTEPL){
00128 std::cout << "DTTSTheta::add_btiT: step out of range: " << step;
00129 std::cout << " trigger not added!" << std::endl;
00130 return;
00131 }
00132 _trig[step-DTConfigTSTheta::NSTEPF].set(n-1);
00133 _ntrig[step-DTConfigTSTheta::NSTEPF]++;
00134
00135 if(btitrig->code()==8){
00136 _Htrig[step-DTConfigTSTheta::NSTEPF].set(n-1);
00137 _nHtrig[step-DTConfigTSTheta::NSTEPF]++;
00138 }
00139
00140 if(config()->debug()){
00141 std::cout << "BTI Trigger added at step " << step;
00142 std::cout << " to DTTSTheta at position " << n << std::endl;
00143 }
00144 return;
00145 }
00146
00147 void
00148 DTTSTheta::runDTTSTheta() {
00149
00150 for(int is=DTConfigTSTheta::NSTEPF;is<DTConfigTSTheta::NSTEPL+1;is++) {
00151 if(_ntrig[is-DTConfigTSTheta::NSTEPF]>0) {
00152 int i=0;
00153 int code[8];
00154 int pos[8];
00155 int qual[8];
00156 for(i=0;i<8;i++) {
00157
00158 pos[i]=btiMask(is)->byte(i).any();
00159 qual[i]=btiQual(is)->byte(i).any();
00160 code[i]=pos[i]+qual[i];
00161 }
00162
00163
00164
00165 if(pos[7] > pos[6]) pos[6]=pos[7];
00166 if(qual[7] > qual[6]) qual[6]=qual[7];
00167 if(code[7] > code[6]) code[6]=code[7];
00168
00169
00170 if(config()->debug()){
00171 std::cout << " wheel = " << wheel() << " station = " << station() << " sector = " << sector() << std::endl;
00172 std::cout << " pos : ";
00173 for(i=0;i<8;i++) {
00174 std::cout << pos[i] << " ";
00175 }
00176 std::cout << std::endl;
00177 std::cout << " qual : ";
00178 for(i=0;i<8;i++) {
00179 std::cout << qual[i] << " ";
00180 }
00181 std::cout << std::endl;
00182 std::cout << " code : ";
00183 for(i=0;i<8;i++) {
00184 std::cout << code[i] << " ";
00185
00186 }
00187 std::cout << std::endl;
00188 std::cout << std::endl;
00189 }
00190
00191 _cache.push_back(DTChambThSegm(ChamberId(),is,pos,qual));
00192 }
00193 }
00194
00195
00196 if(config()->debug()){
00197 if(_cache.size()>0){
00198 std::cout << "====================================================" << std::endl;
00199 std::cout << " Theta segments " << std::endl;
00200 std::vector<DTChambThSegm>::const_iterator p;
00201 for(p=_cache.begin();p<_cache.end();p++) {
00202 p->print();
00203 }
00204 std::cout << "====================================================" << std::endl;
00205 }
00206 }
00207
00208
00209 }
00210
00211 int
00212 DTTSTheta::nSegm(int step) {
00213 int n=0;
00214 std::vector<DTChambThSegm>::const_iterator p;
00215 for(p=begin(); p<end(); p++) {
00216 if(p->step()==step)n++;
00217 }
00218 return n;
00219 }
00220
00221 const DTChambThSegm*
00222 DTTSTheta::segment(int step, unsigned n) {
00223 std::vector<DTChambThSegm>::const_iterator p;
00224 for(p=begin();p<end();p++){
00225 if(p->step()==step&&n==1)
00226 return &(*p);
00227 }
00228 return 0;
00229 }
00230
00231 int
00232 DTTSTheta::nTrig(int step) {
00233 if(step<DTConfigTSTheta::NSTEPF||step>DTConfigTSTheta::NSTEPL){
00234 std::cout << "DTTSTheta::nTrig: step out of range " << step;
00235 std::cout << " 0 returned" << std::endl;
00236 return 0;
00237 }
00238 if(size()>0) return _ntrig[step-DTConfigTSTheta::NSTEPF];
00239 return 0;
00240 }
00241
00242 int
00243 DTTSTheta::nHTrig(int step) {
00244 if(step<DTConfigTSTheta::NSTEPF||step>DTConfigTSTheta::NSTEPL){
00245 std::cout << "DTTSTheta::nHTrig: step out of range " << step;
00246 std::cout << " 0 returned" << std::endl;
00247 return 0;
00248 }
00249 if(size()>0) return _nHtrig[step-DTConfigTSTheta::NSTEPF];
00250 return 0;
00251 }
00252
00253 BitArray<DTConfigTSTheta::NCELLTH>*
00254 DTTSTheta::btiMask(int step) const {
00255 if(step<DTConfigTSTheta::NSTEPF||step>DTConfigTSTheta::NSTEPL){
00256 std::cout << "DTTSTheta::btiMask: step out of range " << step;
00257 std::cout << " empty pointer returned" << std::endl;
00258 return 0;
00259 }
00260 return (BitArray<DTConfigTSTheta::NCELLTH>*)&_trig[step-DTConfigTSTheta::NSTEPF];
00261 }
00262
00263 BitArray<DTConfigTSTheta::NCELLTH>*
00264 DTTSTheta::btiQual(int step) const {
00265 if(step<DTConfigTSTheta::NSTEPF||step>DTConfigTSTheta::NSTEPL){
00266 std::cout << "DTTSTheta::btiQual: step out of range " << step;
00267 std::cout << " empty pointer returned" << std::endl;
00268 return 0;
00269 }
00270 return (BitArray<DTConfigTSTheta::NCELLTH>*)&_Htrig[step-DTConfigTSTheta::NSTEPF];
00271 }
00272
00273 LocalPoint
00274 DTTSTheta::localPosition(const DTTrigData* tr) const {
00275
00276
00277 return LocalPoint(0,0,0);
00278 }
00279
00280 LocalVector
00281 DTTSTheta::localDirection(const DTTrigData* tr) const {
00282
00283
00284 return LocalVector(0,0,0);
00285 }
00286
00287 void
00288 DTTSTheta::print(const DTTrigData* trig) const {
00289 trig->print();
00290
00291
00292
00293 }