CMS 3D CMS Logo

CSCMotherboard.cc

Go to the documentation of this file.
00001 //-----------------------------------------------------------------------------
00002 //
00003 //   Class: CSCMotherboard
00004 //
00005 //   Description: 
00006 //    When the Trigger MotherBoard is instantiated it instantiates an ALCT
00007 //    and CLCT board.  The Motherboard takes up to two LCTs from each anode
00008 //    and cathode LCT card and combines them into a single Correlated LCT.
00009 //    The output is up to two Correlated LCTs.
00010 //
00011 //    It can be run in either a test mode, where the arguments are a collection
00012 //    of wire times and arrays of comparator times & comparator results, or
00013 //    for general use, with with wire digi and comparator digi collections as
00014 //    arguments.  In the latter mode, the wire & strip info is passed on the
00015 //    LCTProcessors, where it is decoded and converted into a convenient form.
00016 //    After running the anode and cathode LCTProcessors, TMB correlates the
00017 //    anode and cathode LCTs.  At present, it simply matches the best CLCT
00018 //    with the best ALCT; perhaps a better algorithm will be determined in
00019 //    the future.  The MotherBoard then determines a few more numbers (such as
00020 //    quality and pattern) from the ALCT and CLCT information, and constructs
00021 //    two correlated LCTs.
00022 //
00023 //    correlateLCTs() may need to be modified to take into account a
00024 //    possibility of ALCTs and CLCTs arriving at different bx times.
00025 //
00026 //   Author List: Benn Tannenbaum 28 August 1999 benn@physics.ucla.edu
00027 //                Based on code by Nick Wisniewski (nw@its.caltech.edu)
00028 //                and a framework by Darin Acosta (acosta@phys.ufl.edu).
00029 //
00030 //   $Date: 2009/03/16 17:51:14 $
00031 //   $Revision: 1.19 $
00032 //
00033 //   Modifications: Numerous later improvements by Jason Mumford and
00034 //                  Slava Valuev (see cvs in ORCA).
00035 //   Porting from ORCA by S. Valuev (Slava.Valuev@cern.ch), May 2006.
00036 //
00037 //-----------------------------------------------------------------------------
00038 
00039 #include <L1Trigger/CSCTriggerPrimitives/src/CSCMotherboard.h>
00040 //#include <Utilities/Timing/interface/TimingReport.h>
00041 #include <FWCore/MessageLogger/interface/MessageLogger.h>
00042 #include <DataFormats/MuonDetId/interface/CSCTriggerNumbering.h>
00043 
00044 CSCMotherboard::CSCMotherboard() :
00045                    theEndcap(1), theStation(1), theSector(1),
00046                    theSubsector(1), theTrigChamber(1) {
00047   // Constructor used only for testing.  -JM
00048   alct = new CSCAnodeLCTProcessor();
00049   clct = new CSCCathodeLCTProcessor();
00050   infoV = 2;
00051 }
00052 
00053 CSCMotherboard::CSCMotherboard(unsigned endcap, unsigned station,
00054                                unsigned sector, unsigned subsector,
00055                                unsigned chamber,
00056                                const edm::ParameterSet& conf) :
00057                    theEndcap(endcap), theStation(station), theSector(sector),
00058                    theSubsector(subsector), theTrigChamber(chamber) {
00059   // Normal constructor.  -JM
00060   // Pass ALCT, CLCT, and common parameters on to ALCT and CLCT processors.
00061 
00062   // Some congiguration parameters and some details of the emulator
00063   // algorithms depend on whether we want to emulate the trigger logic
00064   // used in TB/MTCC or its future, hoped-for modification (the latter
00065   // is used in MC studies).
00066   edm::ParameterSet commonParams =
00067     conf.getParameter<edm::ParameterSet>("commonParam");
00068   isMTCC = commonParams.getParameter<bool>("isMTCC");
00069 
00070   // Switch for a new (2007) version of the TMB firmware.
00071   isTMB07 = commonParams.getParameter<bool>("isTMB07");
00072 
00073   // Choose the appropriate set of configuration parameters depending on
00074   // isMTCC flag.
00075   edm::ParameterSet alctParams, clctParams;
00076   if (!isMTCC) {
00077     alctParams = conf.getParameter<edm::ParameterSet>("alctParamDef");
00078     clctParams = conf.getParameter<edm::ParameterSet>("clctParamDef");
00079   }
00080   else {
00081     alctParams = conf.getParameter<edm::ParameterSet>("alctParamMTCC2");
00082     clctParams = conf.getParameter<edm::ParameterSet>("clctParamMTCC2");
00083   }
00084   alct = new CSCAnodeLCTProcessor(endcap, station, sector, subsector,
00085                                   chamber, alctParams, commonParams);
00086   clct = new CSCCathodeLCTProcessor(endcap, station, sector, subsector,
00087                                     chamber, clctParams, commonParams);
00088 
00089   // Motherboard parameters: common for all configurations.
00090   edm::ParameterSet tmbParams  =
00091     conf.getParameter<edm::ParameterSet>("tmbParam");
00092   infoV = tmbParams.getUntrackedParameter<int>("verbosity", 0);
00093 
00094   // test to make sure that what goes into a correlated LCT is also what
00095   // comes back out.
00096   // testLCT();
00097 }
00098 
00099 CSCMotherboard::~CSCMotherboard() {
00100   if (alct) delete alct;
00101   if (clct) delete clct;
00102 }
00103 
00104 void CSCMotherboard::clear() {
00105   if (alct) alct->clear();
00106   if (clct) clct->clear();
00107   firstLCT.clear();
00108   secondLCT.clear();
00109 }
00110 
00111 // Set configuration parameters obtained via EventSetup mechanism.
00112 void CSCMotherboard::setConfigParameters(const CSCL1TPParameters* conf) {
00113   alct->setConfigParameters(conf);
00114   clct->setConfigParameters(conf);
00115   // No config. parameters for the TMB itself yet.
00116 }
00117 
00118 void CSCMotherboard::run(
00119            std::vector<int> time1[CSCConstants::NUM_LAYERS][CSCConstants::MAX_NUM_WIRES],
00120            int time2[CSCConstants::NUM_LAYERS][CSCConstants::MAX_NUM_STRIPS],
00121            int triad[CSCConstants::NUM_LAYERS][CSCConstants::MAX_NUM_STRIPS]) {
00122   // Debug version.  -JM
00123   clear();
00124   alct->run(time1);               // run anode LCT
00125   clct->run(triad, time2, time2); // run cathodeLCT
00126 
00127   int first_bx = CSCAnodeLCTProcessor::MAX_ALCT_BINS;
00128   for (int bx = 0; bx < CSCAnodeLCTProcessor::MAX_ALCT_BINS; bx++) {
00129     if (alct->bestALCT[bx].isValid()) {first_bx = bx; break;}
00130   }
00131   // Valid ALCT
00132   if (first_bx < CSCAnodeLCTProcessor::MAX_ALCT_BINS) {
00133     correlateLCTs(alct->bestALCT[first_bx], alct->secondALCT[first_bx],
00134                   clct->bestCLCT, clct->secondCLCT);
00135   }
00136   // Valid CLCT: use dummy ALCT
00137   else if (clct->bestCLCT.isValid()) {
00138     correlateLCTs(alct->bestALCT[0], alct->secondALCT[0],
00139                   clct->bestCLCT, clct->secondCLCT);
00140   }
00141 }
00142 
00143 std::vector<CSCCorrelatedLCTDigi>
00144 CSCMotherboard::run(const CSCWireDigiCollection* wiredc,
00145                     const CSCComparatorDigiCollection* compdc) {
00146   clear();
00147   if (alct && clct) {
00148     {
00149       //static TimingReport::Item & alctTimer =
00150       //(*TimingReport::current())["CSCAnodeLCTProcessor:run"];
00151       //TimeMe t(alctTimer, false);
00152       std::vector<CSCALCTDigi> alctV = alct->run(wiredc); // run anodeLCT
00153     }
00154     {
00155       //static TimingReport::Item & clctTimer =
00156       //(*TimingReport::current())["CSCCathodeLCTProcessor:run"];
00157       //TimeMe t(clctTimer, false);
00158       std::vector<CSCCLCTDigi> clctV = clct->run(compdc); // run cathodeLCT
00159     }
00160 
00161     // It may seem like the next function should be
00162     // 'if (alct->bestALCT.isValid() && clct->bestCLCT.isValid())'.
00163     // It is || instead of && because the decision to reject non-valid LCTs
00164     // is handled further upstream (assuming at least 1 is valid).  -JM
00165     int first_bx = CSCAnodeLCTProcessor::MAX_ALCT_BINS;
00166     for (int bx = 0; bx < CSCAnodeLCTProcessor::MAX_ALCT_BINS; bx++) {
00167       if (alct->bestALCT[bx].isValid()) {first_bx = bx; break;}
00168     }
00169     // Valid ALCT
00170     if (first_bx < CSCAnodeLCTProcessor::MAX_ALCT_BINS) {
00171       correlateLCTs(alct->bestALCT[first_bx], alct->secondALCT[first_bx],
00172                     clct->bestCLCT, clct->secondCLCT);
00173     }
00174     // Valid CLCT: use dummy ALCT
00175     else if (clct->bestCLCT.isValid()) {
00176       correlateLCTs(alct->bestALCT[0], alct->secondALCT[0],
00177                     clct->bestCLCT, clct->secondCLCT);
00178     }
00179     if (infoV > 0) {
00180       if (firstLCT.isValid())  LogDebug("CSCMotherboard") << firstLCT;
00181       if (secondLCT.isValid()) LogDebug("CSCMotherboard") << secondLCT;
00182     }
00183   }
00184   else {
00185     if (infoV > 0) edm::LogWarning("CSCMotherboard")
00186       << "+++ run() called for non-existing ALCT/CLCT processor! +++ \n";
00187   }
00188 
00189   std::vector<CSCCorrelatedLCTDigi> tmpV = getLCTs();
00190   return tmpV;
00191 }
00192 
00193 // Returns vector of found correlated LCTs, if any.
00194 std::vector<CSCCorrelatedLCTDigi> CSCMotherboard::getLCTs() {
00195   std::vector<CSCCorrelatedLCTDigi> tmpV;
00196 
00197   // Do not report LCTs found in ME1/A.
00198   bool me11 =
00199     (theStation == 1 &&
00200      CSCTriggerNumbering::ringFromTriggerLabels(theStation,theTrigChamber)==1);
00201   if (firstLCT.isValid())
00202     if (!me11 || firstLCT.getStrip() <= 127)
00203       tmpV.push_back(firstLCT);
00204   if (secondLCT.isValid())
00205     if (!me11 || secondLCT.getStrip() <= 127)
00206       tmpV.push_back(secondLCT);
00207   return tmpV;
00208 }
00209 
00210 void CSCMotherboard::correlateLCTs(CSCALCTDigi bestALCT,
00211                                    CSCALCTDigi secondALCT,
00212                                    CSCCLCTDigi bestCLCT,
00213                                    CSCCLCTDigi secondCLCT) {
00214 
00215   bool anodeBestValid     = bestALCT.isValid();
00216   bool anodeSecondValid   = secondALCT.isValid();
00217   bool cathodeBestValid   = bestCLCT.isValid();
00218   bool cathodeSecondValid = secondCLCT.isValid();
00219 
00220   // determine STA value; obsolete as of April 2002.
00221   // int tempSTA = findSTA(anodeBestValid, anodeSecondValid,
00222   //                       cathodeBestValid, cathodeSecondValid);
00223 
00224   if (anodeBestValid && !anodeSecondValid)     secondALCT = bestALCT;
00225   if (!anodeBestValid && anodeSecondValid)     bestALCT   = secondALCT;
00226   if (cathodeBestValid && !cathodeSecondValid) secondCLCT = bestCLCT;
00227   if (!cathodeBestValid && cathodeSecondValid) bestCLCT   = secondCLCT;
00228 
00229   // TB/MTCC only, or always????
00230   if (isMTCC && (bestCLCT.isValid() == false && secondCLCT.isValid() == false))
00231     return;
00232 
00233   firstLCT = constructLCTs(bestALCT, bestCLCT);
00234   firstLCT.setTrknmb(1);
00235 
00236   if ((secondALCT != bestALCT) || (secondCLCT != bestCLCT)) {
00237     secondLCT = constructLCTs(secondALCT, secondCLCT);
00238     secondLCT.setTrknmb(2);
00239   }
00240 }
00241 
00242 // This method calculates all the TMB words and then passes them to the
00243 // constructor of correlated LCTs.
00244 CSCCorrelatedLCTDigi CSCMotherboard::constructLCTs(const CSCALCTDigi& aLCT,
00245                                                    const CSCCLCTDigi& cLCT) {
00246   // CLCT pattern number
00247   unsigned int pattern = encodePattern(cLCT.getPattern(), cLCT.getStripType());
00248 
00249   // LCT quality number
00250   unsigned int quality = findQuality(aLCT, cLCT);
00251 
00252   // bunch crossing match; obsolete as of April 2002.
00253   // int bxnMatch = findBxnMatch(aLCT.getBX(), cLCT.getBX());
00254 
00255   // Bunch crossing: get it from cathode LCT if anode LCT is not there.
00256   int bx = aLCT.isValid() ? aLCT.getBX() : cLCT.getBX();
00257 
00258   // construct correlated LCT; temporarily assign track number of 0.
00259   int trknmb = 0;
00260   CSCCorrelatedLCTDigi thisLCT(trknmb, 1, quality, aLCT.getKeyWG(),
00261                                cLCT.getKeyStrip(), pattern, cLCT.getBend(),
00262                                bx, 0, 0, 0, theTrigChamber);
00263   return thisLCT;
00264 }
00265 
00266 // CLCT pattern number: encodes the pattern number itself and
00267 // whether the pattern consists of half-strips or di-strips.
00268 unsigned int CSCMotherboard::encodePattern(const int ptn,
00269                                            const int stripType) {
00270   const int kPatternBitWidth = 4;
00271   unsigned int pattern;
00272 
00273   if (!isTMB07) {
00274     // Cathode pattern number is a kPatternBitWidth-1 bit word.
00275     pattern = (abs(ptn) & ((1<<(kPatternBitWidth-1))-1));
00276 
00277     // The pattern has the MSB (4th bit in the default version) set if it
00278     // consists of half-strips.
00279     if (stripType) {
00280       pattern = pattern | (1<<(kPatternBitWidth-1));
00281     }
00282   }
00283   else {
00284     // In the TMB07 firmware, LCT pattern is just a 4-bit CLCT pattern.
00285     pattern = (abs(ptn) & ((1<<kPatternBitWidth)-1));
00286   }
00287 
00288   return pattern;
00289 }
00290 
00291 // 4-bit LCT quality number.  Definition can be found in
00292 // https://www.phys.ufl.edu/~acosta/tb/tmb_quality.txt.  Made by TMB lookup
00293 // tables and used for MPC sorting.
00294 unsigned int CSCMotherboard::findQuality(const CSCALCTDigi& aLCT,
00295                                          const CSCCLCTDigi& cLCT) {
00296   unsigned int quality = 0;
00297 
00298   if (!isTMB07) {
00299     bool isDistrip = (cLCT.getStripType() == 0);
00300 
00301     if (aLCT.isValid() && !(cLCT.isValid())) {    // no CLCT
00302       if (aLCT.getAccelerator()) {quality =  1;}
00303       else                       {quality =  3;}
00304     }
00305     else if (!(aLCT.isValid()) && cLCT.isValid()) { // no ALCT
00306       if (isDistrip)             {quality =  4;}
00307       else                       {quality =  5;}
00308     }
00309     else if (aLCT.isValid() && cLCT.isValid()) { // both ALCT and CLCT
00310       if (aLCT.getAccelerator()) {quality =  2;} // accelerator muon
00311       else {                                     // collision muon
00312         // CLCT quality is, in fact, the number of layers hit, so subtract 3
00313         // to get quality analogous to ALCT one.
00314         int sumQual = aLCT.getQuality() + (cLCT.getQuality()-3);
00315         if (sumQual < 1 || sumQual > 6) {
00316           if (infoV > 0) edm::LogWarning("CSCMotherboard")
00317             << "+++ findQuality: sumQual = " << sumQual << "+++ \n";
00318         }
00319         if (isDistrip) { // distrip pattern
00320           if (sumQual == 2)      {quality =  6;}
00321           else if (sumQual == 3) {quality =  7;}
00322           else if (sumQual == 4) {quality =  8;}
00323           else if (sumQual == 5) {quality =  9;}
00324           else if (sumQual == 6) {quality = 10;}
00325         }
00326         else {            // halfstrip pattern
00327           if (sumQual == 2)      {quality = 11;}
00328           else if (sumQual == 3) {quality = 12;}
00329           else if (sumQual == 4) {quality = 13;}
00330           else if (sumQual == 5) {quality = 14;}
00331           else if (sumQual == 6) {quality = 15;}
00332         }
00333       }
00334     }
00335   }
00336 #ifdef OLD
00337   else {
00338     // Temporary definition, used until July 2008.
00339     // First if statement is fictitious, just to help the CSC TF emulator
00340     // handle such cases (one needs to make sure they will be accounted for
00341     // in the new quality definition.
00342     if (!(aLCT.isValid()) || !(cLCT.isValid())) {
00343       if (aLCT.isValid() && !(cLCT.isValid()))      quality = 1; // no CLCT
00344       else if (!(aLCT.isValid()) && cLCT.isValid()) quality = 2; // no ALCT
00345       else quality = 0; // both absent; should never happen.
00346     }
00347     else {
00348       // Sum of ALCT and CLCT quality bits.  CLCT quality is, in fact, the
00349       // number of layers hit, so subtract 3 to put it to the same footing as
00350       // the ALCT quality.
00351       int sumQual = aLCT.getQuality() + (cLCT.getQuality()-3);
00352       if (sumQual < 1 || sumQual > 6) {
00353         if (infoV > 0) edm::LogWarning("CSCMotherboard")
00354           << "+++ findQuality: Unexpected sumQual = " << sumQual << "+++\n";
00355       }
00356 
00357       // LCT quality is basically the sum of ALCT and CLCT qualities, but split
00358       // in two groups depending on the CLCT pattern id (higher quality for
00359       // straighter patterns).
00360       int offset = 0;
00361       if (cLCT.getPattern() <= 7) offset = 4;
00362       else                        offset = 9;
00363       quality = offset + sumQual;
00364     }
00365   }
00366 #endif
00367   else {
00368     // 2008 definition.
00369     if (!(aLCT.isValid()) || !(cLCT.isValid())) {
00370       if (aLCT.isValid() && !(cLCT.isValid()))      quality = 1; // no CLCT
00371       else if (!(aLCT.isValid()) && cLCT.isValid()) quality = 2; // no ALCT
00372       else quality = 0; // both absent; should never happen.
00373     }
00374     else {
00375       int pattern = cLCT.getPattern();
00376       if (pattern == 1) quality = 3; // layer-trigger in CLCT
00377       else {
00378         // CLCT quality is the number of layers hit minus 3.
00379         // CLCT quality is the number of layers hit.
00380         bool a4 = (aLCT.getQuality() >= 1);
00381         bool c4 = (cLCT.getQuality() >= 4);
00382         //              quality = 4; "reserved for low-quality muons in future"
00383         if      (!a4 && !c4) quality = 5; // marginal anode and cathode
00384         else if ( a4 && !c4) quality = 6; // HQ anode, but marginal cathode
00385         else if (!a4 &&  c4) quality = 7; // HQ cathode, but marginal anode
00386         else if ( a4 &&  c4) {
00387           if (aLCT.getAccelerator()) quality = 8; // HQ muon, but accel ALCT
00388           else {
00389             // quality =  9; "reserved for HQ muons with future patterns
00390             // quality = 10; "reserved for HQ muons with future patterns
00391             if (pattern == 2 || pattern == 3)      quality = 11;
00392             else if (pattern == 4 || pattern == 5) quality = 12;
00393             else if (pattern == 6 || pattern == 7) quality = 13;
00394             else if (pattern == 8 || pattern == 9) quality = 14;
00395             else if (pattern == 10)                quality = 15;
00396             else {
00397               if (infoV > 0) edm::LogWarning("CSCMotherboard")
00398                 << "+++ findQuality: Unexpected CLCT pattern id = "
00399                 << pattern << "+++\n";
00400             }
00401           }
00402         }
00403       }
00404     }
00405   }
00406   return quality;
00407 }
00408 
00409 // STA is a status word for the ALCTs and CLCTs.  -JM
00410 // In the latest TMB design this word is no longer present /SV, 03-Apr-02/.
00411 int CSCMotherboard::findSTA(const bool a1, const bool a2,
00412                             const bool c1, const bool c2) {
00413   int STA = 0; // if no incoming LCTs
00414 
00415   if (a1 && a2 && !c1 && !c2)        // if 2 anode LCTs and 0 cathode LCTs
00416       STA = 1;
00417   else if (!a1 && !a2 && c1 && c2)   // if 2 cathode LCTs and 0 anode LCTs
00418       STA = 1;
00419   else if (!a1 && a2 && c1 && !c2)   // if ambiguous LCTs
00420       STA = 1;
00421   else if (a1 && !a2 && !c1 && c2)   // if ambiguous LCTs
00422       STA = 1;
00423   else if (!a1 && a2 && !c1 && c2)   // if ambiguous LCTs
00424       STA = 1;
00425   else if (a1 && !a2 && c1 && c2)    // if 1 anode and 2 cathodes exist...
00426       STA = 2;
00427   else if (!a1 && a2 && c1 && c2)
00428       STA = 1;
00429   else if (a1 && a2 && c1 && !c2)    // if 2 anodes and 1 cathode exist...
00430       STA = 2;
00431   else if (a1 && a2 && !c1 && c2)
00432       STA = 1;
00433   else if (a1 && !a2 && c1 && !c2)   // if one unambiguous muon
00434       STA = 3;
00435   else if (a1 && a2 && c1 && c2)     // if two unambiguous muons
00436       STA = 3;
00437   else if (a1 || a2 || c1 || c2 )    // if only 1 LCT
00438       STA = 1;
00439   else {
00440     if (infoV > 0) edm::LogWarning("CSCMotherboard")
00441       << "+++ findSTA: STA not assigned: \n"
00442       << " a1 " << a1 << " a2 " << a2 << " c1 " << c1 << " c2 " << c2
00443       << " +++ \n";
00444   }
00445 
00446   return STA;
00447 }
00448 
00449 // Cathode-Anode bxn match, as defined in Trigger TDR.
00450 // This word is not present in the TMB-02 design /SV, 03-Apr-02/.
00451 int CSCMotherboard::findBxnMatch(const int aBxn, const int cBxn) {
00452   int bxnMatch = 3; // worst case scenario
00453 
00454   if (aBxn == cBxn) {bxnMatch = 0;} // perfect match
00455   else if ((aBxn - cBxn) == 1) {bxnMatch = 1;}
00456   else if ((cBxn - aBxn) == 1) {bxnMatch = 2;}
00457   return bxnMatch;
00458 }
00459 
00460 void CSCMotherboard::testLCT() {
00461   unsigned int lctPattern, lctQuality;
00462   for (int pattern = 0; pattern < 8; pattern++) {
00463     for (int bend = 0; bend < 2; bend++) {
00464       for (int cfeb = 0; cfeb < 5; cfeb++) {
00465         for (int strip = 0; strip < 32; strip++) {
00466           for (int bx = 0; bx < 7; bx++) {
00467             for (int stripType = 0; stripType < 2; stripType++) {
00468               for (int quality = 3; quality < 7; quality++) {
00469                 CSCCLCTDigi cLCT(1, quality, pattern, stripType, bend,
00470                                  strip, cfeb, bx);
00471                 lctPattern = encodePattern(cLCT.getPattern(),
00472                                            cLCT.getStripType());
00473                 for (int aQuality = 0; aQuality < 4; aQuality++) {
00474                   for (int wireGroup = 0; wireGroup < 120; wireGroup++) {
00475                     for (int abx = 0; abx < 7; abx++) {
00476                       CSCALCTDigi aLCT(1, aQuality, 0, 1, wireGroup, abx);
00477                       lctQuality = findQuality(aLCT, cLCT);
00478                       CSCCorrelatedLCTDigi
00479                         thisLCT(0, 1, lctQuality, aLCT.getKeyWG(),
00480                                 cLCT.getKeyStrip(), lctPattern, cLCT.getBend(),
00481                                 aLCT.getBX());
00482                       if (lctPattern != static_cast<unsigned int>(thisLCT.getPattern()) )
00483                         edm::LogWarning("CSCMotherboard")
00484                           << "pattern mismatch: " << lctPattern
00485                           << " " << thisLCT.getPattern();
00486                       if (bend != thisLCT.getBend()) 
00487                         edm::LogWarning("CSCMotherboard")
00488                           << "bend mismatch: " << bend
00489                           << " " << thisLCT.getBend();
00490                       int key_strip = 32*cfeb + strip;
00491                       if (key_strip != thisLCT.getStrip()) 
00492                         edm::LogWarning("CSCMotherboard")
00493                           << "strip mismatch: " << key_strip
00494                           << " " << thisLCT.getStrip();
00495                       if (wireGroup != thisLCT.getKeyWG()) 
00496                         edm::LogWarning("CSCMotherboard")
00497                           << "wire group mismatch: " << wireGroup
00498                           << " " << thisLCT.getKeyWG();
00499                       if (abx != thisLCT.getBX()) 
00500                         edm::LogWarning("CSCMotherboard")
00501                           << "bx mismatch: " << abx << " " << thisLCT.getBX();
00502                       if (lctQuality != static_cast<unsigned int>(thisLCT.getQuality())) 
00503                         edm::LogWarning("CSCMotherboard")
00504                           << "quality mismatch: " << lctQuality
00505                           << " " << thisLCT.getQuality();
00506                     }
00507                   }
00508                 }
00509               }
00510             }
00511           }
00512         }
00513       }
00514     }
00515   }
00516 }

Generated on Tue Jun 9 17:39:59 2009 for CMSSW by  doxygen 1.5.4