| Classes | Job Modules | Data Objects | Services | Algorithms | Tools | Packages | Directories | Tracs |

In This Package:

DaqTraits.cc

Go to the documentation of this file.
00001 /*
00002  *  DaqTraits.cc
00003  *  DaqReadoutFormat
00004  *
00005  *  Created by Simon Patton on 7/21/10.
00006  *  Copyright 2010 DayaBay Collaboration. All rights reserved.
00007  *
00008  */
00009 
00010 #include "DaqReadoutFormat/DaqTraits.h"
00011 
00012 #include "DaqReadoutFormat/BitsDefinition.h"
00013 
00014 using DybDaq::BitsDefinition;
00015 using DybDaq::DaqTraits;
00016 using std::string;
00017 
00018 DaqTraits::DaqTraits() {
00019 }
00020 
00021 DaqTraits::~DaqTraits() {
00022 }
00023 
00024 unsigned int DaqTraits::readUnsignedInt(const char*& buffer,
00025                                         const DaqTraits& traits,
00026                                         unsigned int field) {
00027         unsigned int index = traits.index(field);
00028         if (index == traits.illegalField()) {
00029                 return 0;
00030         }
00031         unsigned int fourBytes = *(((unsigned int*)buffer) + index);
00032         return (fourBytes >> traits.shift(field)) & traits.mask(field);
00033 }
00034 
00035 unsigned int DaqTraits::marker(unsigned int marker) const {
00036         if (marker >= markersEnd()) {
00037                 return illegalMarker();
00038         }
00039         return markers()[marker];
00040 }
00041 
00042 unsigned int DaqTraits::index(unsigned int field) const {
00043         if (field >= fieldsEnd()) {
00044                 return illegalField();
00045         }
00046         return indices()[field];
00047 }
00048 
00049 unsigned int DaqTraits::shift(unsigned int field) const {
00050         if (field >= fieldsEnd()) {
00051                 return 0;
00052         }
00053         return shifts()[field];
00054 }
00055 
00056 unsigned int DaqTraits::mask(unsigned int field) const {
00057         if (field >= fieldsEnd()) {
00058                 return 0;
00059         }
00060         return masks()[field];
00061 }
00062 
00063 const char* DaqTraits::boolAsString(bool value) const {
00064     if (value) {
00065         return "yes";
00066     }
00067     return "no";
00068 }
00069 
00070 DaqTraits::Definitions* DaqTraits::definitions(unsigned int /* component */) const {
00071     return 0;
00072 }
00073 
00074 void DaqTraits::setDefinitions(DaqTraits::Definitions* /* definitions */,
00075                                unsigned int /* component */) {
00076 }
00077 
00078 const unsigned int* DaqTraits::componentFields(unsigned int /* component */) const {
00079     return 0;
00080 }
00081 
00082 const unsigned int DaqTraits::componentFieldsEnd(unsigned int /* component */) const {
00083     return 0;
00084 }
00085 
00086 const string* DaqTraits::descriptions() const {
00087     return 0;
00088 }
00089 
00090 const DaqTraits::Definitions& DaqTraits::bitsDefinitions(unsigned int component) const {
00091     DaqTraits::Definitions* componentDefinitions = definitions(component);
00092     if (0 == componentDefinitions) {
00093         componentDefinitions = new DaqTraits::Definitions();
00094         const unsigned int* fieldIndices = componentFields(component);
00095         const unsigned int finished = componentFieldsEnd(component);
00096         for (unsigned int index = 0;
00097              finished != index;
00098              ++index) {
00099             const unsigned int field = fieldIndices[index];
00100             unsigned int shift = shifts()[field];
00101             const unsigned int mask = masks()[field];
00102             unsigned int count = 0;
00103             unsigned int bit = 1;
00104             if (0 != mask) {
00105                 if (0 == (bit & mask)) {
00106                     // Assumes it is binary
00107                     while (32 > count && (0 == (bit & mask)) ) {
00108                         bit <<= 1;
00109                         ++count;
00110                     }
00111                     shift = count - 1;
00112                     count = 1;
00113                 } else {
00114                     while (32 > count && (0 != (bit & mask)) ) {
00115                         bit <<= 1;
00116                         ++count;
00117                     }
00118                 }
00119             }
00120             componentDefinitions->push_back(BitsDefinition(field,
00121                                                            indices()[field],
00122                                                            shift,
00123                                                            count,
00124                                                            descriptions()[field]));
00125         }
00126         const_cast<DaqTraits*>(this)->setDefinitions(componentDefinitions,
00127                                                      component);
00128     }
00129     return *componentDefinitions;
00130 }
| Classes | Job Modules | Data Objects | Services | Algorithms | Tools | Packages | Directories | Tracs |

Generated on Mon Apr 11 20:07:43 2011 for DaqReadoutFormat by doxygen 1.4.7