Main Page | Modules | Namespace List | Class Hierarchy | Alphabetical List | Class List | Directories | File List | Namespace Members | Class Members | File Members | Related Pages

PlexSEIdAltL.cxx

Go to the documentation of this file.
00001 
00002 // $Id: PlexSEIdAltL.cxx,v 1.36 2008/11/09 04:11:34 rhatcher Exp $
00003 //
00004 // PlexSEIdAltL
00005 //
00006 // PlexSEIdAltL is a vector+iterator for PlexSEIdAltLItems
00007 //
00008 // Author:  R. Hatcher 2001.10.22
00009 //
00011 
00012 #include "Plex/PlexSEIdAltL.h"
00013 #include "Plex/PlexCalib.h"
00014 
00015 #include "MessageService/MsgService.h"
00016 #include "MessageService/MsgStream.h"
00017 #include "MessageService/MsgFormat.h"
00018 CVSID("$Id: PlexSEIdAltL.cxx,v 1.36 2008/11/09 04:11:34 rhatcher Exp $");
00019 
00020 #include "TMath.h"
00021 
00022 #include <string>
00023 #include <algorithm>
00024 #include <cassert>
00025 
00026 // a static dummy PlexSEIdAltLItem for when we need to return a
00027 // reference to an item and the list is empty
00028 static PlexSEIdAltLItem dummyPlexSEIdAltLItem;
00029 
00030 ClassImp(PlexSEIdAltL)
00031 
00032 //_____________________________________________________________________________
00033 
00034 UInt_t PlexSEIdAltL::fgFmtFlag = 0;
00035 const UInt_t defaultFmtFlag = 0xFFFFFFFF & ~PlexSEIdAltL::fmt_PixelSpot;
00036 
00037 UInt_t lastFmtFlag = 0;
00038 string fmtHeaderTitle = "";
00039 string fmtHeaderULine = "";
00040 
00041 //_____________________________________________________________________________
00042 ostream& operator<<(ostream& os, const PlexSEIdAltL& alt)
00043 {
00044   // Print out the list
00045   if (alt.size() <= 0) {
00046      os << "Empty-PlexSEIdAltL " << endl;
00047      return os;
00048   }
00049 
00050   UInt_t fmt = PlexSEIdAltL::GetFmtFlag();
00051   // disallow no formatting bits
00052   if (!fmt) fmt = defaultFmtFlag;
00053   bool doFmtIndex     = fmt & PlexSEIdAltL::fmt_Index;
00054   bool doFmtCursor    = fmt & PlexSEIdAltL::fmt_Cursor;
00055   bool doFmtBest      = fmt & PlexSEIdAltL::fmt_Best;
00056   bool doFmtStripEnd  = fmt & PlexSEIdAltL::fmt_StripEnd;
00057   bool doFmtPixelSpot = fmt & PlexSEIdAltL::fmt_PixelSpot;
00058   bool doFmtWeight    = fmt & PlexSEIdAltL::fmt_Weight;
00059   bool doFmtPE        = fmt & PlexSEIdAltL::fmt_PE;
00060   bool doFmtSigLin    = fmt & PlexSEIdAltL::fmt_SigLin;
00061   bool doFmtSigCorr   = fmt & PlexSEIdAltL::fmt_SigCorr;
00062   bool doFmtTime      = fmt & PlexSEIdAltL::fmt_Time;
00063 
00064   static const MsgFormat i1("%1d");
00065   static const MsgFormat f3p1("%3.1f");
00066   static const MsgFormat f5p1("%5.1f");
00067   static const MsgFormat f7p2("%7.2f");
00068 
00069   if (lastFmtFlag != fmt) {
00070     // construct the header line and the line of "---"'s and "+"'s
00071     lastFmtFlag = fmt;
00072     fmtHeaderTitle = "";
00073     fmtHeaderULine = "";
00074     if (doFmtBest) {
00075       fmtHeaderTitle += " ";
00076       fmtHeaderULine += "-";
00077     }
00078     if (doFmtCursor) {
00079       fmtHeaderTitle += " ";
00080       fmtHeaderULine += "-";
00081     }
00082     if (doFmtIndex) {
00083       fmtHeaderTitle += " i |";
00084       fmtHeaderULine += "---+";
00085     }
00086     if (doFmtStripEnd) {
00087       //                  F0001Uc003-
00088       fmtHeaderTitle += " StripEndId  |";
00089       fmtHeaderULine += "-------------+";
00090     }
00091     if (doFmtPixelSpot) {
00092       //                  MUXB-UV-?L00:00-SPOT-0-00-00
00093       fmtHeaderTitle += " PixelSpot                    |";
00094       fmtHeaderULine += "------------------------------+";
00095     }
00096     if (doFmtWeight) {
00097       fmtHeaderTitle += " wgt |";
00098       fmtHeaderULine += "-----+";
00099     }
00100     if (doFmtPE) {
00101       fmtHeaderTitle += " PE    |";
00102       fmtHeaderULine += "-------+";
00103     }
00104     if (doFmtSigLin) {
00105       fmtHeaderTitle += " Linear  |";
00106       fmtHeaderULine += "---------+";
00107     }
00108     if (doFmtSigCorr) {
00109       fmtHeaderTitle += " S2SCorr |";
00110       fmtHeaderULine += "---------+";
00111     }
00112     if (doFmtTime) {
00113       fmtHeaderTitle += " Time    |";
00114       fmtHeaderULine += "---------+";
00115     }
00116   }
00117   
00118   os << fmtHeaderTitle << endl;
00119   os << fmtHeaderULine << endl;
00120 
00121   PlexSEIdAltLItem& best    = dummyPlexSEIdAltLItem;
00122 
00123   for (unsigned int i=0; i<alt.size(); ++i) {
00124     const PlexSEIdAltLItem& item = alt[i];
00125     if (doFmtBest)   {   best    = alt.GetBestItem();
00126                          os << ((item == best)      ? '!' : ' ');
00127     }
00128     if (doFmtCursor) {  
00129                          os << ((i == alt.fCurrent) ? '@' : ' ');
00130     }
00131     if (doFmtIndex)      os << " " << i1(i) << " |";
00132     if (doFmtStripEnd)   os << " " << item.GetSEId().AsString("C") << " |";
00133     if (doFmtPixelSpot)  os << " " << item.GetPixelSpotId().AsString("c") << " |";
00134     if (doFmtWeight)     os << " " << f3p1(item.GetWeight()) << " |";
00135     if (doFmtPE)         os << " " << f5p1(item.GetPE()) << " |";
00136     if (doFmtSigLin)     os << " " << f7p2(item.GetSigLin()) << " |";
00137     if (doFmtSigCorr)    os << " " << f7p2(item.GetSigCorr()) << " |";
00138     if (doFmtTime)       os << " " << f7p2(item.GetTime()) << " |";
00139     os << endl;
00140   }
00141       
00142 #ifdef OLDFORMATTING
00143     char marker;
00144     PlexStripEndId seid;
00145     MsgFormat i2("%2d");
00146     MsgFormat i3("%3d");
00147     //     MsgFormat f10("%10.5f");
00148     
00149     // format the header line
00150     os << "     i | StripEndId (size=" << i2(alt.size()) 
00151        << ",cur=" << i2(alt.fCurrent) << ") "
00152        << "| weight    " 
00153        << "| muon unit " 
00154        << "| t offset  " 
00155        << endl;
00156     os << "-------+-----------------------------"
00157        << "+-----------" 
00158        << "+-----------" 
00159        << "+-----------" 
00160        << endl;
00161     
00162     for (unsigned int i=0; i<alt.size(); ++i) {
00163       (i==alt.fCurrent) ? marker = '*' : marker = ' ';
00164       PlexSEIdAltLItem item = alt[i];
00165       seid   = item.GetSEId();
00166       os << " " << marker << " " << i3(i) 
00167          << " " << item
00168          << endl;
00169     }
00170 #endif
00171 
00172   return os;
00173 }
00174 
00175 //_____________________________________________________________________________
00176 PlexSEIdAltL::PlexSEIdAltL()
00177    : fCurrent(0), fDemuxVetoFlag(0), fError(kUnchecked)     
00178 {
00179    // Default constructor
00180 }
00181 
00182 //_____________________________________________________________________________
00183 PlexSEIdAltL::PlexSEIdAltL(const PlexSEIdAltL &rhs)
00184    : std::vector<PlexSEIdAltLItem>(),
00185      fCurrent(rhs.fCurrent), 
00186      fDemuxVetoFlag(rhs.fDemuxVetoFlag), 
00187      fError(kUnchecked)
00188 {
00189 
00190    // deep copy constructor
00191    for (unsigned int i=0; i<rhs.size(); ++i) {
00192       this->push_back(rhs[i]);
00193    }
00194 
00195 }
00196 
00197 //_____________________________________________________________________________
00198 PlexSEIdAltL::~PlexSEIdAltL()
00199 {
00200    // delete all the owned sub-objects
00201 }
00202 
00203 #ifdef ALTL_EXPLICIT_ASSIGNMENT
00204 //_____________________________________________________________________________
00205 PlexSEIdAltL& PlexSEIdAltL::operator=(const PlexSEIdAltL& rhs)
00206 {
00207    // deep assignment
00208    clear();
00209    for (unsigned int i=0; i<rhs.size(); ++i) {
00210       this->push_back(rhs[i]);
00211    }
00212    fCurrent       = rhs.fCurrent;
00213    fDemuxVetoFlag = rhs.fDemuxVetoFlag;
00214    fError         = rhs.fError;
00215 }
00216 #endif
00217 
00218 //_____________________________________________________________________________
00219 void PlexSEIdAltL::AddStripEndId(const PlexStripEndId& seid, 
00220                                  const PlexPixelSpotId& spot,
00221                                  Float_t weight, const PlexCalib* calib, 
00222                                  Int_t adc, Double_t time)
00223 {
00224    // add a new item to the list
00225 
00226    fError = kUnchecked;  // adding a new strip makes consistency unknown
00227 
00228    if (calib) {
00229       PlexSEIdAltLItem item = calib->CalibStripEnd(seid,spot,adc,time);
00230       item.SetWeight(weight);
00231       this->push_back(item);
00232    }
00233    else {
00234       PlexSEIdAltLItem item(seid,spot,weight);
00235       this->push_back(item);
00236    }
00237 }
00238 
00239 //_____________________________________________________________________________
00240 void PlexSEIdAltL::DropCurrent()
00241 {
00242    // Remove current item from the list.
00243    // Do not reset current position of iterator.
00244    // An iterative removal should start from Last() and use Previous().
00245 
00246    UShort_t n = size();
00247 
00248    if (n <= 0) return;  // one cannot drop what one doesn't have
00249    if (fCurrent>=n) {   
00250       MSG("Plex",Msg::kWarning)
00251          << "can not DropCurrent (fCurrent=" << fCurrent 
00252          << ") on a list of " << n << " items " << endl;
00253       return;
00254    }
00255 
00256    PlexSEIdAltLIter cursor = this->begin() + fCurrent;
00257    // delete the owned item
00258    this->erase(cursor);
00259 
00260 }
00261 
00262 //_____________________________________________________________________________
00263 void PlexSEIdAltL::DropZeroWeights()
00264 {
00265    // Remove pairs from the list that have weight == 0
00266 
00267    if (size() <= 0) return;  // one cannot drop what one doesn't have
00268 
00269    // move all zero items to the end
00270    PlexSEIdAltLIter new_end = 
00271       remove_if(this->begin(), this->end(), 
00272                 mem_fun_ref(&PlexSEIdAltLItem::IsZeroWeight));
00273 
00274    // erase the moved items out of the array 
00275    this->erase(new_end,this->end());
00276 
00277 }
00278 
00279 //_____________________________________________________________________________
00280 void PlexSEIdAltL::KeepTopWeights(UInt_t n, Bool_t keeporder)
00281 {
00282    // Remove all but "n" pairs from the list (top "n" sorted by weight)
00283    // Final relative order of elements in the list is unchanged
00284    // if keeporder=kTRUE otherwise list ordered by decending weights.
00285    // If "n" would separate values of the same weight then
00286    // more than "n" are kept.
00287 
00288    unsigned int i, cnt = size();
00289 
00290    if (cnt <= 0) return;  // one cannot drop what one doesn't have
00291 
00292    if (n >= cnt) {
00293       if (keeporder) return; // keep everything, no change in order
00294       else n = cnt;          // perform sort but don't go beyond end
00295    }
00296 
00297    PlexSEIdAltL& self = *this;
00298 
00299    if (n <= 0) { // special case for new size=0
00300       this->clear();
00301       return;
00302    }
00303 
00304    // make a copy of the weights
00305    // sort it
00306    // select the nth down the list for lowest weight value to keep
00307    Float_t *sortedwgt = new Float_t[cnt];
00308 #if ROOT_VERSION_CODE < ROOT_VERSION(5,21,5)
00309    Int_t   *sortedindx = new Int_t[cnt];
00310 #else
00311    UInt_t  *sortedindx = new UInt_t[cnt];
00312 #endif
00313    for (i=0; i<cnt; i++) sortedwgt[i] = self[i].GetWeight();
00314    Bool_t down=kTRUE;
00315    TMath::Sort(cnt,sortedwgt,sortedindx,down);
00316    // n-1 because C arrays start with 0
00317    Int_t   icut = sortedindx[n-1];
00318    Float_t  cut = sortedwgt[icut]; 
00319 
00320    // count final size
00321    // may not be ==n because of two entries with same weight
00322    vector<PlexSEIdAltLItem> tempVector;
00323    for (i=0; i<cnt; i++) {
00324       unsigned int indxold = i;
00325       if (!keeporder) indxold = sortedindx[i];
00326       if (self[indxold].GetWeight() >= cut) {
00327          tempVector.push_back(self[indxold]);
00328       }
00329    }
00330 
00331    // replace current vector with newly created temporary
00332    this->swap(tempVector);
00333 
00334    delete [] sortedwgt;
00335    delete [] sortedindx;
00336 
00337 }
00338 
00339 //_____________________________________________________________________________
00340 void PlexSEIdAltL::ClearWeights()
00341 {
00342    // set all the weights to zero
00343 
00344    PlexSEIdAltL& self = *this;
00345    for (unsigned int i=0; i<size(); i++) (self[i]).SetWeight(0.0);
00346 }
00347 
00348 //_____________________________________________________________________________
00349 const PlexSEIdAltLItem& PlexSEIdAltL::GetBestItem() const
00350 {
00351    // find the PlexSEIdAltLItem with the highest weight (const version)
00352 
00353    unsigned int thesize = size();
00354    if (thesize == 0) {
00355      static int msglimit = 25;  // limit the number of complaints
00356      if (msglimit) {
00357        // Empty lists generally happen because of raw channel id's
00358        // that don't map back to real strips (for instance due to
00359        // unused pixels on a tube being illuminated by crosstalk).
00360        // Complain a bit ... but then shut up.
00361        MSG("Plex",Msg::kWarning)
00362          << "can not GetBestItem() from an empty list" << endl;
00363        if (--msglimit == 0) 
00364          MSG("Plex",Msg::kWarning)
00365            << " ... last warning of this type" << endl;
00366      }
00367      return dummyPlexSEIdAltLItem;;
00368    }
00369    else if (thesize == 1) {
00370      // simple case of only one element
00371      return (*this)[0];
00372    }
00373 
00374    PlexSEIdAltLConstIter cursor = this->begin();
00375    PlexSEIdAltLConstIter best   = this->begin();
00376    Float_t wgt, maxwgt = -1.0e-37;
00377    while (cursor != this->end()) {
00378       const PlexSEIdAltLItem& item = *cursor;
00379       if ( (wgt = item.GetWeight()) > maxwgt ) {
00380          maxwgt = wgt; best = cursor;
00381       }
00382       cursor++;
00383    }
00384    return *best;
00385       
00386 }
00387 
00388 //_____________________________________________________________________________
00389 PlexSEIdAltLItem& PlexSEIdAltL::GetBestItem()
00390 {
00391    // find the PlexSEIdAltLItem with the highest weight
00392 
00393    unsigned int thesize = size();
00394    if (thesize == 0) {
00395      static int msglimit = 25;  // limit the number of complaints
00396      if (msglimit) {
00397        // Empty lists generally happen because of raw channel id's
00398        // that don't map back to real strips (for instance due to
00399        // unused pixels on a tube being illuminated by crosstalk).
00400        // Complain a bit ... but then shut up.
00401        MSG("Plex",Msg::kWarning)
00402          << "can not GetBestItem() from an empty list" << endl;
00403        if (--msglimit == 0) 
00404          MSG("Plex",Msg::kWarning)
00405            << " ... last warning of this type" << endl;
00406      }
00407      return dummyPlexSEIdAltLItem;;
00408    }
00409    else if (thesize == 1) {
00410      // simple case of only one element
00411      return (*this)[0];
00412    }
00413    
00414    PlexSEIdAltLIter cursor = this->begin();
00415    PlexSEIdAltLIter best   = this->begin();
00416    Float_t wgt, maxwgt = -1.0e-37;
00417    while (cursor != this->end()) {
00418       PlexSEIdAltLItem& item = *cursor;
00419       if ( (wgt = item.GetWeight()) > maxwgt ) {
00420          maxwgt = wgt; best = cursor;
00421       }
00422       cursor++;
00423    }
00424    return *best;
00425       
00426 }
00427 
00428 //_____________________________________________________________________________
00429 PlexStripEndId PlexSEIdAltL::GetBestSEId() const
00430 {
00431    // find the PlexStripEndId with the highest weight and return by value
00432 
00433    return GetBestItem().GetSEId();
00434 
00435 }
00436 
00437 //_____________________________________________________________________________
00438 Float_t PlexSEIdAltL::GetBestWeight() const
00439 {
00440    // find the highest weight
00441 
00442    return GetBestItem().GetWeight();
00443 
00444 }
00445 
00446 //_____________________________________________________________________________
00447 const PlexSEIdAltLItem& PlexSEIdAltL::GetCurrentItem() const
00448 {
00449    // return by value current PlexSEIdAltLItem (const version)
00450 
00451    if (!IsValid()) {
00452      if (size() <= 0) 
00453        MSG("Plex",Msg::kWarning)
00454          << "can not GetCurrentItem() from an empty list" << endl;
00455      else
00456        MSG("Plex",Msg::kWarning)
00457          << "can not GetCurrentItem() when !IsValid()" << endl;
00458      return dummyPlexSEIdAltLItem;;
00459    }
00460 
00461    PlexSEIdAltLConstIter cursor = this->begin() + fCurrent;
00462    return *cursor;
00463 
00464 }
00465 
00466 //_____________________________________________________________________________
00467 PlexSEIdAltLItem& PlexSEIdAltL::GetCurrentItem()
00468 {
00469    // return by value current PlexSEIdAltLItem
00470 
00471    if (!IsValid()) {
00472      if (size() <= 0) 
00473        MSG("Plex",Msg::kWarning)
00474          << "can not GetCurrentItem() from an empty list" << endl;
00475      else
00476        MSG("Plex",Msg::kWarning)
00477          << "can not GetCurrentItem() when !IsValid()" << endl;
00478      return dummyPlexSEIdAltLItem;;
00479    }
00480 
00481    PlexSEIdAltLIter cursor = this->begin() + fCurrent;
00482    return *cursor;
00483 
00484 }
00485 
00486 //_____________________________________________________________________________
00487 PlexStripEndId PlexSEIdAltL::GetCurrentSEId() const
00488 {
00489    // return by value current PlexStripEndId
00490 
00491    return GetCurrentItem().GetSEId();
00492 
00493 }
00494 
00495 //_____________________________________________________________________________
00496 Float_t PlexSEIdAltL::GetCurrentWeight() const
00497 {
00498    // return the weight attached to the current PlexStripEndId
00499 
00500    return GetCurrentItem().GetWeight();
00501 
00502 }
00503 
00504 //_____________________________________________________________________________
00505 Detector::Detector_t PlexSEIdAltL::GetDetector(Bool_t reportError) const
00506 {
00507    // Return the Detector of the PlexStripEndID's in this list.
00508    // This is meaningful only in a correctly filled PlexSEIdAltL
00509 
00510    TestConsistency(reportError);
00511    
00512    if ( fError & kBadDetector || size() < 1 ) 
00513       return (Detector::Detector_t)0; // bad detector
00514 
00515    PlexSEIdAltLConstIter cursor = this->begin();
00516    return (*cursor).GetSEId().GetDetector();
00517 
00518 }
00519 
00520 //_____________________________________________________________________________
00521 Bool_t PlexSEIdAltL::IsVetoShield(Bool_t reportError) const
00522 {
00523    // Return the whether this alt-list reflect veto shield strips
00524    // This is meaningful only in a correctly filled PlexSEIdAltL
00525 
00526    TestConsistency(reportError);
00527    
00528    // if inconsistent ... don't take it as part of veto shield
00529    // "nothing" isn't part of a veto shield
00530    if ( fError & kBadIsVeto || size() < 1 ) return false;
00531 
00532    PlexSEIdAltLConstIter cursor = this->begin();
00533    return (*cursor).GetSEId().IsVetoShield();
00534 
00535 }
00536 
00537 //_____________________________________________________________________________
00538 StripEnd::StripEnd_t PlexSEIdAltL::GetEnd(Bool_t reportError) const
00539 {
00540    // Return the end (kEast,kWest) of the PlexStripEndID's in this list.
00541    // This is meaningful only in a correctly cabled detector
00542    // if there are mis-cablings then it could return nonsense.
00543 
00544    TestConsistency(reportError);
00545 
00546    if ( fError & kBadEnd || size() < 1 ) 
00547       return StripEnd::kUnknown;  // bad end
00548 
00549    PlexSEIdAltLConstIter cursor = this->begin();
00550    return (*cursor).GetSEId().GetEnd();
00551 
00552 }
00553 
00554 //_____________________________________________________________________________
00555 Int_t PlexSEIdAltL::GetPlane(Bool_t reportError) const
00556 {
00557    // Return the plane # of the PlexStripEndId's in this list.
00558    // This is meaningful only in a correctly cabled detector
00559    // if there are mis-cablings then it could return nonsense.
00560 
00561    TestConsistency(reportError);
00562 
00563    if ( fError & kBadPlane || size() < 1 )
00564       return -1;  // bad plane
00565 
00566    PlexSEIdAltLConstIter cursor = this->begin();
00567    return (*cursor).GetSEId().GetPlane();
00568 
00569 }
00570 
00571 
00572 //_____________________________________________________________________________
00573 PlaneView::PlaneView_t PlexSEIdAltL::GetPlaneView(Bool_t reportError) const
00574 {
00575    // Return the PlaneView of the PlexStripEndID's in this list.
00576    // This is meaningful only in a correctly cabled detector
00577    // if there are mis-cablings then it could return nonsense.
00578 
00579    TestConsistency(reportError);
00580 
00581    if ( fError & kBadPlaneView || size() < 1 )
00582       return PlaneView::kUnknown;  // bad view
00583 
00584    PlexSEIdAltLConstIter cursor = this->begin();
00585    return (*cursor).GetSEId().GetPlaneView();
00586 
00587 }
00588 
00589 //_____________________________________________________________________________
00590 Bool_t PlexSEIdAltL::SetToOppositeEnds(PlexSEIdAltL& that)
00591 {
00592    // Given two PlexSEIdAltL's set both "current" iterators
00593    // to entries that are at opposite ends of the same strip
00594    // and return true.  If no legal combination exists then
00595    // return false leaving current positions unchanged.
00596 
00597    UInt_t where_this =      fCurrent;
00598    UInt_t where_that = that.fCurrent;
00599 
00600    this->SetFirst();
00601    while (this->IsValid()) {
00602       PlexStripEndId seid_this = this->GetCurrentSEId();
00603       that.SetFirst();
00604       while (that.IsValid()) {
00605          PlexStripEndId seid_that = that.GetCurrentSEId();
00606          if (seid_this.IsOppositeStripEnd(seid_that)) return true;
00607          that.Next();
00608       }
00609       this->Next();
00610    }
00611    // fell through means no legal match
00612    fCurrent      = where_this;
00613    that.fCurrent = where_that;
00614    return false;
00615 
00616 }
00617 //_____________________________________________________________________________
00618 Bool_t PlexSEIdAltL::IsValid() const
00619 {
00620    // is current position a valid entry
00621 
00622   return size()>0 && fCurrent<size(); 
00623 
00624 }
00625 
00626 //_____________________________________________________________________________
00627 void PlexSEIdAltL::Print(Option_t *option) const
00628 {
00629    // Print out the list
00630 
00631    unsigned int n = size();
00632 
00633    if (n <= 0) {
00634       printf("Empty PlexSEIdAltL\n");
00635       return;
00636    }
00637 
00638    const PlexSEIdAltLItem& best = GetBestItem();
00639 
00640    const PlexSEIdAltL& self = *this;
00641    unsigned int i;
00642    char cursormarker, bestmarker;
00643    PlexStripEndId seid;
00644 //   Float_t        weight;
00645 
00646    switch (option[0]) {
00647    case 'c':
00648    case 'C':
00649       // compact notation assumes that there isn't a mixup
00650       // and all items share a common detector/plane/subpart/end
00651       seid = GetCurrentSEId(); // any will do
00652       printf("[%1.1s|%4d %1.1s%1.1s|%1.1s%1.1s]",
00653              Detector::AsString(seid.GetDetector()),
00654              seid.GetPlane(),
00655              PlaneView::AsString(seid.GetPlaneView()),
00656              PlaneCoverage::AsString(seid.GetPlaneCoverage()),
00657              StripEnd::AsString(seid.GetSubPart()),
00658              StripEnd::AsString(seid.GetEnd()));
00659       for (i=0; i<n; i++) {
00660          const PlexSEIdAltLItem& item = self[i];
00661          bestmarker   = (item == best)     ? '!' : ' ';
00662          cursormarker = (i    == fCurrent) ? '@' : ' ';
00663          seid   = item.GetSEId();
00664          printf(" %c%c%3d",bestmarker,cursormarker,seid.GetStrip());
00665 
00666       }
00667       if (option[0] == 'C') {
00668          printf("\n          wgt ");
00669          for (i=0; i<n; i++) {
00670             const PlexSEIdAltLItem& item = self[i];
00671             printf(" %5.3f",item.GetWeight());
00672          }
00673       }
00674       printf("\n");
00675 
00676       break;
00677    default:
00678 
00679      cout << *this;
00680 
00681    }
00682 }
00683 
00684 //_____________________________________________________________________________
00685 void PlexSEIdAltL::SetCurrentWeight(Float_t weight)
00686 {
00687    // set the weight attached to the current PlexStripEndId
00688 
00689    if (!IsValid()) return; // no list or out of range
00690    PlexSEIdAltLIter cursor = this->begin() + fCurrent;
00691    (*cursor).SetWeight(weight);
00692 
00693 }
00694 
00695 //_____________________________________________________________________________
00696 void PlexSEIdAltL::AddToCurrentWeight(Float_t wgtadd)
00697 {
00698    // add to the weight attached to the current PlexStripEndId
00699 
00700    if (!IsValid()) return; // no list or out of range
00701    PlexSEIdAltLIter cursor = this->begin() + fCurrent;
00702    (*cursor).AddToWeight(wgtadd);
00703 
00704 }
00705 
00706 //_____________________________________________________________________________
00707 void PlexSEIdAltL::NormalizeWeights(Float_t wgtsum)
00708 {
00709    // normalize the weights so sum adds up to "wgtsum"
00710    // if all values are exactly zero, then this sets them
00711    // to wgtsum/fSize
00712 
00713    unsigned int n=size();
00714 
00715    if (n < 1) return;
00716 
00717    Float_t sum = 0.0;
00718 
00719    PlexSEIdAltLIter iter, the_end=this->end();
00720 
00721    iter = this->begin();
00722    while (iter != the_end) { sum += (*iter).GetWeight(); iter++; }
00723 
00724    iter = this->begin();
00725    if ( sum != 0.0 ) {
00726       Float_t scale = wgtsum/sum;
00727       while (iter != the_end) {
00728          Float_t wgt = (*iter).GetWeight() * scale;
00729          (*iter).SetWeight(wgt);
00730          iter++;
00731       }
00732    } else {
00733       // all weight values were zero
00734       Float_t equalwgt = wgtsum/(float)n;
00735       while (iter != the_end) { (*iter).SetWeight(equalwgt); iter++; }
00736    }
00737 
00738 }
00739 
00740 //_____________________________________________________________________________
00741 
00742 void PlexSEIdAltL::TestConsistency(Bool_t reportError) const
00743 {
00744    // Set the fError flag if the list is inconsistent
00745    // in terms of GetDetector, GetEnd, GetPlane, GetPlaneView
00746 
00747    // skip if already checked (adding values clears this flag)
00748    if ( kUnchecked != fError ) return;
00749 
00750    // clear all errors
00751    fError = 0;
00752 
00753    unsigned int n = size();
00754 
00755    // a single entry is consistent with itself
00756    if ( 1 == n ) return;
00757 
00758    // an empty list is consistent with nothing
00759    // and asking for these value will be problematic
00760    if ( 0 == n ) {
00761       fError = kBadDetector | kBadEnd | kBadPlane | kBadPlaneView;
00762       return;
00763    }
00764 
00765    PlexSEIdAltLConstIter iter = this->begin();
00766    PlexSEIdAltLConstIter the_end = this->end();
00767 
00768    PlexStripEndId first_seid = (*iter).GetSEId();
00769    Detector::Detector_t     firstdet = first_seid.GetDetector();
00770    StripEnd::StripEnd_t     firstend = first_seid.GetEnd();
00771    Int_t                    firstpln = first_seid.GetPlane();
00772    PlaneView::PlaneView_t   firstpvw = first_seid.GetPlaneView();
00773    Bool_t                   firstisv = first_seid.IsVetoShield();
00774 
00775    iter++;  // no need to recheck the first against itself
00776    while (iter != the_end) {
00777       PlexStripEndId alt_seid = (*iter).GetSEId();
00778       Detector::Detector_t     altdet = alt_seid.GetDetector();
00779       StripEnd::StripEnd_t     altend = alt_seid.GetEnd();
00780       Int_t                    altpln = alt_seid.GetPlane();
00781       PlaneView::PlaneView_t   altpvw = alt_seid.GetPlaneView();
00782       Bool_t                   altisv = alt_seid.IsVetoShield();
00783       if ( altdet != firstdet ) fError |= kBadDetector;
00784       if ( altend != firstend ) fError |= kBadEnd;
00785       // veto shield connections span modules (and thus "planes"
00786       // and "planeviews")
00787       if ( ! altisv ) {
00788         if ( altpln != firstpln ) fError |= kBadPlane;
00789         if ( altpvw != firstpvw ) fError |= kBadPlaneView;
00790       }
00791       if ( altisv != firstisv ) fError |= kBadIsVeto;
00792       iter++;
00793    }
00794    
00795    if ( fError != kOkay && reportError ) {
00796       MSG("Plex",Msg::kWarning)
00797          << "PlexSEIdAltL::TestConsistency - list is inconsistent " 
00798          << "(0x" << hex << setfill('0') << setw(2) << fError
00799          << setfill(' ') << dec << ")" << endl;
00800 
00801       UInt_t old_fmt = GetFmtFlag();
00802       SetFmtFlag(fmt_Index|fmt_StripEnd|fmt_PixelSpot);
00803       this->Print();
00804       SetFmtFlag(old_fmt);
00805    }
00806 
00807 }
00808 
00809 //_____________________________________________________________________________

Generated on Mon Feb 15 11:07:23 2010 for loon by  doxygen 1.3.9.1