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

RawLITimingSummaryBlock.cxx

Go to the documentation of this file.
00001 
00002 // $Id: RawLITimingSummaryBlock.cxx,v 1.14 2004/09/02 21:21:23 rhatcher Exp $
00003 // 
00004 // RawLITimingSummaryBlock 
00005 // 
00006 // RawLITimingSummaryBlock holds a block of raw light injection summaries
00007 //  and knows how to unpack it into individual RawLITimingSummary's
00008 //
00009 // Author:  R. Hatcher 2001.05.10
00010 //
00012 
00013 #include "RawData/RawLITimingSummaryBlock.h"
00014 
00015 enum EDebugLITimingSummaryBlock {
00016    dbg_DumpHeaderOnUnpack = 0x0001,
00017    dbg_DumpCrateOnUnpack  = 0x0002,
00018    dbg_DumpTimingSumOnUnpack = 0x0004
00019 };
00020 
00021 UInt_t RawLITimingSummaryBlock::fgDebugFlags = 0;
00022 //  dbg_DumpCrateOnUnpack | dbg_DumpTimingSumOnUnpack;
00023 
00024 #include "RawData/RawLIHeader.h"
00025 #include "RawData/RawLITimingSummary.h"
00026 
00027 #include "MessageService/MsgStream.h"
00028 #include "MessageService/MsgService.h"
00029 CVSID("$Id: RawLITimingSummaryBlock.cxx,v 1.14 2004/09/02 21:21:23 rhatcher Exp $");
00030 
00031 #include "RawData/RawBlockRegistry.h"
00032 REGISTERRAWBLOCK(RawLITimingSummaryBlock,kMdBlockLiSummaryTiming,0);
00033 
00034 ClassImp(RawLITimingSummaryBlock)
00035 
00036 //_____________________________________________________________________________
00037 RawLITimingSummaryBlock::RawLITimingSummaryBlock() :
00038   RawDataBlock(), fRawLIHeader(0), fRawCrateStatuses(0), fRawTimingSums(0)
00039 {
00040    // Default constructor
00041 }
00042 
00043 //_____________________________________________________________________________
00044 RawLITimingSummaryBlock::RawLITimingSummaryBlock(const Int_t *block)
00045   : RawDataBlock(block), 
00046     fRawLIHeader(0), fRawCrateStatuses(0), fRawTimingSums(0)
00047 {
00048    //  stored block format is:
00049    //---------------------
00050    //  0   # words in block
00051    //  1   checksum
00052    //  2   Block Id
00053    //-----
00054    //  3   CalibType   | CalibPoint#
00055    //  4   PulserBox # | LED #
00056    //  5   PulseHeight | PulseWidth
00057    //  6   # pulses    | flashing frequency
00058    //  7   T0 (1st ROP) sec
00059    //  8   T0 (1st ROP) nsec
00060    //  9   spare field 0 (v0,v1) : # pulses used in this summary (v2)
00061    // 10   spare field 1 (v0,v1) : spare field 0  (v2)
00062    //-----
00063    // 11   Crate # i (+extra)
00064    // 12   # of crate entries (N_i)
00065    //-----
00066    // 13   ChAdd 1_i  | # of entries
00067    // 14   Mean
00068    // 15   RMS
00069    // 16   ChAdd 2_i  | # of entries
00070    // 17   Mean
00071    // 18   RMS
00072    //  ...
00073    //      ChAdd N_i  | # of entries
00074    //      Mean
00075    //      RMS
00076    //-----
00077    //  x   Crate # j (+extra)
00078    //      # of crate entries (N_j)
00079    //-----
00080    //      ChAdd 1_j  | # of entries
00081    //      Mean
00082    //      RMS
00083    //      ChAdd 2_j  | # of entries
00084    //      Mean
00085    //      RMS
00086    //  ...
00087    //      ChAdd N_j  | # of entries
00088    //      Mean*4     | RMS*4
00089 
00090 }
00091 
00092 //_____________________________________________________________________________
00093 RawLITimingSummaryBlock::~RawLITimingSummaryBlock()
00094 {
00095 
00096    if (fRawLIHeader) {
00097       delete fRawLIHeader;
00098       fRawLIHeader = 0;
00099    }
00100 
00101    if (fRawTimingSums) {
00102       fRawTimingSums->Delete();
00103       delete fRawTimingSums;
00104       fRawTimingSums = 0;
00105    }
00106    if (fRawCrateStatuses) {
00107       fRawCrateStatuses->Delete();
00108       delete fRawCrateStatuses;
00109       fRawCrateStatuses = 0;
00110    }
00111    return;
00112 }
00113 
00114 //_____________________________________________________________________________
00115 RawLITimingSummaryBlock& RawLITimingSummaryBlock::operator=(const RawLITimingSummaryBlock& rhs)
00116 {
00117 
00118    // deep copy assignment
00119    if (this != &rhs) {
00120      RawDataBlock::operator=(rhs);
00121 
00122      if (fRawLIHeader) {
00123        delete fRawLIHeader;
00124        fRawLIHeader = 0;
00125      }
00126      
00127      if (fRawTimingSums) {
00128        fRawTimingSums->Delete();
00129        delete fRawTimingSums;
00130        fRawTimingSums = 0;
00131      }
00132      if (fRawCrateStatuses) {
00133        fRawCrateStatuses->Delete();
00134        delete fRawCrateStatuses;
00135        fRawCrateStatuses = 0;
00136      }
00137    }
00138    return *this;
00139 }
00140 
00141 //_____________________________________________________________________________
00142 Int_t RawLITimingSummaryBlock::GetNumberOfSummaries(void) const
00143 {
00144    // create/fill the TObjArray of RawTimingSummarys (if it doesn't exist)
00145    // return the number of entries
00146 
00147    if ( ! fRawTimingSums ) FillRawTimingSums();
00148    return fRawTimingSums->GetEntriesFast(); // known not to have gaps
00149 }
00150 
00151 //_____________________________________________________________________________
00152 const RawLITimingSummary* RawLITimingSummaryBlock::At(Int_t idx) const
00153 {
00154    // create/fill the TObjArray of RawTimingSummarys (if it doesn't exist)
00155    // return pointer to the i-th element
00156 
00157    if ( ! fRawTimingSums ) FillRawTimingSums();
00158    return (RawLITimingSummary*) fRawTimingSums->At(idx);
00159 }
00160 
00161 //_____________________________________________________________________________
00162 TIter RawLITimingSummaryBlock::GetDatumIter(Bool_t dir) const
00163 {
00164    // create/fill the TObjArray of RawTimingSummarys (if it doesn't exist)
00165    // return an iterator to look over them
00166 
00167    if ( ! fRawTimingSums ) FillRawTimingSums();
00168    return TIter(fRawTimingSums,dir);
00169 }
00170 
00171 //_____________________________________________________________________________
00172 Int_t RawLITimingSummaryBlock::IndexOf(RawLITimingSummary *rawTimingSum) const
00173 {
00174    // create/fill the TObjArray of RawTimingSummarys (if it doesn't exist)
00175    // return the index for this object (if contained in the list)
00176 
00177    if ( ! fRawTimingSums ) FillRawTimingSums();
00178    return fRawTimingSums->IndexOf(rawTimingSum);
00179 }
00180 
00181 //_____________________________________________________________________________
00182 void RawLITimingSummaryBlock::FillRawTimingSums() const
00183 {
00184    // create the TObjArray of RawTimingSum (if it doesn't exist)
00185 
00186    if ( fRawTimingSums ) return;   // already filled
00187    if ( fSize <= 0 || fRawBlock == 0) {
00188       MSG("RawData",Msg::kWarning)
00189          << "RawLITimingSummaryBlock::FillRawTimingSums empty block? "
00190          << fSize << " " << fRawBlock << endl;
00191       // build a dummy header at least
00192       fRawLIHeader = new RawLIHeader;
00193       return;
00194    }
00195 
00196    fRawCrateStatuses = new TObjArray();
00197    fRawTimingSums    = new TObjArray();
00198    RawCrateStatus     *cratestatus = 0;
00199    RawLITimingSummary *rawTimingSum   = 0;
00200    const Int_t    *p   = fRawBlock;
00201    const Int_t    *end = fRawBlock + fSize; // 1 beyond end
00202 
00203    RawBlockId rbid = GetBlockId();
00204    Int_t minor = rbid.GetMinor();
00205 
00206    p += 3; // skip #words, blockid and checksum
00207 
00208    // eat up the common header info
00209    fRawLIHeader = new RawLIHeader(rbid,p);
00210 
00211    if (fgDebugFlags&dbg_DumpHeaderOnUnpack) fRawLIHeader->Print();
00212 
00213    while (p<end) {
00214       // start a new crate (pointer advanced by RawCrateStatus ctor
00215       cratestatus = new RawCrateStatus(rbid,p);
00216       fRawCrateStatuses->Add(cratestatus);
00217       Int_t npairs = cratestatus->GetEntries(); 
00218 
00219       if (fgDebugFlags&dbg_DumpCrateOnUnpack) cratestatus->Print();
00220 
00221       for (Int_t ipair = 0; ipair < npairs; ipair++) {
00222          rawTimingSum = new RawLITimingSummary(p,cratestatus,minor);
00223          fRawTimingSums->Add(rawTimingSum);
00224 
00225          if (fgDebugFlags&dbg_DumpTimingSumOnUnpack) rawTimingSum->Print();
00226          if (p>end) {
00227             MSG("RawData",Msg::kWarning)
00228                << "RawLITimingSummaryBlock::FillRawTimingSums crate info seems trashed"
00229                << endl << " SimFlag " << SimFlag::AsString(rbid.GetSimFlag())
00230                << endl;
00231             break;
00232          }
00233       }
00234    }
00235 
00236 }
00237 
00238 //_____________________________________________________________________________
00239 std::ostream& RawLITimingSummaryBlock::FormatToOStream(std::ostream& os, 
00240                                                        Option_t *option) const
00241 {
00242    RawDataBlock::FormatToOStream(os,option);
00243    if (option[0] == 'X') return os;
00244 
00245    TIter iter = GetDatumIter();
00246 
00247    const RawLIHeader* header = GetHeader();
00248    os << (*header);
00249 
00250    os << " " << "Channel         " 
00251       << "entries"
00252       << " " << "      Mean" << "          "
00253       << " " << "       RMS" << "          "
00254       << endl;
00255 
00256    TObject *tobj;
00257    RawLITimingSummary *usum;
00258    while ( ( tobj = iter.Next() ) ) {
00259       usum = dynamic_cast<RawLITimingSummary *>(tobj);
00260       if (usum)  os << (*usum);
00261    }
00262    os << endl;
00263 
00264    return os;
00265 }
00266 
00267 
00268 
00269 
00270 //_____________________________________________________________________________

Generated on Mon Nov 23 05:28:11 2009 for loon by  doxygen 1.3.9.1