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

In This Package:

Detectors.cc

Go to the documentation of this file.
00001 /* From Dan, for RPCs:
00002 
00003 Here's the numbers you probably need:
00004         Near Sites:  54 panels
00005         Far Site:       81 panels
00006         Each panel has 4 layers.
00007         Each layer has 8 channels.
00008         Each channel gives 1 bit.
00009 
00010 So according to your model, you'll have:
00011 
00012 Bits:
00013 | 3 | 2 | 7 | 8 | 8 |
00014 Contents:
00015 | channel  |  layer  |  panel  |  detector  |  site  |
00016 
00017 */
00018 
00019 /* From Dan for AD calib pmts:
00020 
00021 192:  top, target-viewing
00022 193:  bottom, target-viewing
00023 194:  top, gamma-catcher-viewing
00024 195:  bottom, gamma-catcher-viewing
00025 196:  top, mineral-oil-viewing
00026 197:  bottom, mineral-oil-viewing
00027 
00028 He counts from zero, so add +1 here
00029 */
00030 
00031 
00032 #include "Conventions/Detectors.h"
00033 
00034 #include <sstream>
00035 
00036 // Detector
00037 
00038 DayaBay::Detector::Detector(Site::Site_t site,
00039                             DetectorId::DetectorId_t det)
00040  : m_data(0)
00041 {
00042     this->set(site,det);
00043 }
00044 DayaBay::Detector::Detector() : m_data(0) {}
00045 
00046 DayaBay::Detector::~Detector() {}
00047 
00048 void DayaBay::Detector::set(Site::Site_t site, DetectorId::DetectorId_t det)
00049 {
00050     m_data = (site << 24) | (det << 16);
00051 }
00052 
00053 
00054 std::string DayaBay::Detector::asString() const
00055 {
00056     std::stringstream ss;
00057     ss << *this; 
00058     return ss.str();
00059 }
00060 
00061 std::string DayaBay::Detector::detName() const
00062 {
00063     std::string ret = Site::AsString(site());
00064     ret += DetectorId::AsString(detectorId());
00065 
00066     return ret;
00067 }
00068 
00069 DetectorId::DetectorId_t DayaBay::Detector::detectorId() const
00070 {
00071     return (DetectorId::DetectorId_t)((m_data&0x00ff0000)>>16);
00072 }
00073 
00074 Site::Site_t DayaBay::Detector::site() const
00075 {
00076     return (Site::Site_t)((m_data&0xff000000)>>24);
00077 }
00078 
00079 int DayaBay::Detector::fullPackedData() const
00080 {
00081     return m_data;
00082 }
00083 
00084 short int DayaBay::Detector::siteDetPackedData() const
00085 {
00086     return (short int)(m_data>>16);
00087 }
00088 
00089 bool DayaBay::Detector::bogus() const
00090 {
00091     Site::Site_t site = this->site();
00092     DetectorId::DetectorId_t det = this->detectorId();
00093 
00094     return 
00095         // Only far site has AD #3 and #4
00096         ((site != Site::kFar)
00097          &&
00098          (det == DetectorId::kAD3 || det == DetectorId::kAD4))
00099         ||
00100         // Only near & far sites have known detectors
00101         ((site == Site::kMid || site == Site::kAberdeen)
00102          &&
00103          (det != DetectorId::kUnknown))
00104         ;
00105 }
00106 
00107 short int DayaBay::Detector::siteDetPackedFromString(const std::string str){
00108   DetectorId::DetectorId_t detId = DetectorId::FromString("Unknown");
00109   Site::Site_t site = Site::FromString("Unknown");
00110   
00111   //find site
00112   
00113   if (str.find("DayaBay")!=std::string::npos) site=Site::FromString("DayaBay");
00114   if (str.find("LingAo")!=std::string::npos) site=Site::FromString("LingAo");
00115   if (str.find("Mid")!=std::string::npos) site=Site::FromString("Mid");
00116   if (str.find("Far")!=std::string::npos) site=Site::FromString("Far");
00117   if (str.find("Aberdeen")!=std::string::npos) site=Site::FromString("Aberdeen");
00118   if (str.find("SAB")!=std::string::npos) site=Site::FromString("SAB");
00119 
00120   //find detector
00121   
00122   if (str.find("AD1")!=std::string::npos) detId=DetectorId::FromString("AD1");
00123   if (str.find("AD2")!=std::string::npos) detId=DetectorId::FromString("AD2");
00124   if (str.find("AD3")!=std::string::npos) detId=DetectorId::FromString("AD3");
00125   if (str.find("AD4")!=std::string::npos) detId=DetectorId::FromString("AD4");
00126   if (str.find("IWS")!=std::string::npos) detId=DetectorId::FromString("IWS");
00127   if (str.find("OWS")!=std::string::npos) detId=DetectorId::FromString("OWS");
00128   if (str.find("RPC")!=std::string::npos) detId=DetectorId::FromString("RPC");
00129   
00130   return DayaBay::Detector(site,detId).siteDetPackedData();
00131 }
00132 
00133 
00134 std::ostream& DayaBay::operator<<(std::ostream& str, const DayaBay::Detector& det)
00135 {
00136     str << Site::AsString(det.site())
00137         << DetectorId::AsString(det.detectorId());
00138     if (det.bogus()) str << " IS BOGUS";
00139     return str;
00140 }
00141 
00142 bool DayaBay::operator<(const DayaBay::Detector& a, const DayaBay::Detector& b)
00143 {
00144     return a.fullPackedData() < b.fullPackedData();
00145 }
00146 
00147 // DetectorSensor
00148 
00149 DayaBay::DetectorSensor::DetectorSensor(unsigned int sensor_id,
00150                                         Site::Site_t site,
00151                                         DetectorId::DetectorId_t detid)
00152     : Detector(site,detid)
00153 {
00154     m_data += 0x0000ffff&sensor_id;
00155 }
00156 DayaBay::DetectorSensor::~DetectorSensor() {}
00157 
00158 int DayaBay::DetectorSensor::sensorId() const
00159 {
00160     return m_data&0x0000ffff;
00161 }
00162 std::ostream& DayaBay::operator<<(std::ostream& str, const DayaBay::DetectorSensor& detsens)
00163 {
00164     str << Site::AsString(detsens.site())
00165         << DetectorId::AsString(detsens.detectorId())
00166         << " 0x"<< std::hex << detsens.sensorId() << std::dec;
00167     if (detsens.bogus()) str << " IS BOGUS";
00168     return str;
00169 }
00170 
00171 bool DayaBay::DetectorSensor::bogus() const 
00172 {
00173     // nothing to add
00174     return this->Detector::bogus();
00175 }
00176 
00177 // AdPmtSensor
00178 
00179 DayaBay::AdPmtSensor::AdPmtSensor(int ring, int column, Site::Site_t site, 
00180                                   DetectorId::DetectorId_t detid)
00181     : DetectorSensor(ring<<8|column,site,detid)
00182 {
00183 
00184 }
00185 DayaBay::AdPmtSensor::AdPmtSensor(int ring, int column, Site::Site_t site, 
00186                                   int ad_number)
00187     : DetectorSensor(ring<<8|column,site,
00188                      (DetectorId::DetectorId_t)(DetectorId::kAD1 + ad_number -1))
00189 {
00190 }
00191 DayaBay::AdPmtSensor::~AdPmtSensor() {}
00192 
00193 
00194 int DayaBay::AdPmtSensor::ring() const
00195 {
00196     return (this->sensorId()&0x0000ff00)>>8;
00197 }
00198  
00199 int DayaBay::AdPmtSensor::column() const
00200 {
00201     return this->sensorId()&0x000000ff;
00202 }
00203 std::ostream& DayaBay::operator<<(std::ostream& str, const DayaBay::AdPmtSensor& adsens)
00204 {
00205     str << Site::AsString(adsens.site())
00206         << DetectorId::AsString(adsens.detectorId())
00207         << "("<<adsens.column()<<","<<adsens.ring()<<")";
00208     if (adsens.bogus()) str << " IS BOGUS";
00209     return str;
00210 }
00211 
00212 bool DayaBay::AdPmtSensor::bogus() const 
00213 {
00214     if (this->Detector::bogus()) return true;
00215     if (! isAD() ) return true;
00216 
00217     // this hard coding of numerology is bad, but how else to check?
00218     if (!ring() && (column() < 1 || column() > 6)) { // r=0, c=[1,6] for calib pmts
00219         return true;
00220     }
00221     else if (ring() > 8 || column() < 1 || column() > 24) {
00222         return true;
00223     }
00224     return false;
00225 }
00226 
00227 
00228 // PoolPmtSensor
00229 
00230 DayaBay::PoolPmtSensor::PoolPmtSensor(int wall_number, int wall_spot, bool inward_facing,
00231                                       Site::Site_t site, DetectorId::DetectorId_t detid)
00232     : DetectorSensor((inward_facing?(1<<12):0)|(wall_number<<8)|wall_spot,site,detid)
00233 {
00234 }
00235 
00236 
00237 DayaBay::PoolPmtSensor::~PoolPmtSensor()
00238 {
00239 }
00240 
00241 int DayaBay::PoolPmtSensor::wallNumber() const
00242 {
00243     return (this->sensorId()&0x00000f00)>>8;
00244 }
00245 int DayaBay::PoolPmtSensor::wallSpot() const
00246 {
00247     return this->sensorId()&0x000000ff;
00248 }
00249 
00250 bool DayaBay::PoolPmtSensor::inwardFacing() const
00251 {
00252     return this->sensorId()&0x0000f000;
00253 }
00254 
00255 
00256 std::ostream& DayaBay::operator<<(std::ostream& str, const DayaBay::PoolPmtSensor& poolsens)
00257 {
00258     str << Site::AsString(poolsens.site())
00259         << DetectorId::AsString(poolsens.detectorId())
00260         << "("
00261         <<poolsens.wallNumber()<<","
00262         <<poolsens.wallSpot()<<","
00263         <<poolsens.inwardFacing() << ")";
00264     if (poolsens.bogus()) str << " IS BOGUS";
00265     return str;
00266 }
00267 
00268 bool DayaBay::PoolPmtSensor::bogus() const 
00269 {
00270     if (this->Detector::bogus()) return true;
00271     if (! isWaterShield() ) return true;
00272 
00273     // fixme: fill in with numerology
00274 
00275     return false;
00276 }
00277 
00278 
00279 // RpcSensor
00280 
00281 DayaBay::RpcSensor::RpcSensor(int panelRow, int panelColumn, 
00282                               int layer, int strip,
00283                               Site::Site_t site, DetectorId::DetectorId_t detid)
00284   : DetectorSensor((panelRow<<12)|(panelColumn<<8)|(layer<<4)|strip,site,detid)
00285 {
00286 }
00287 
00288 
00289 DayaBay::RpcSensor::~RpcSensor()
00290 {
00291 }
00292 
00293 int DayaBay::RpcSensor::panelRow() const
00294 {
00295     return (this->sensorId()&0x0000f000)>>12;
00296 }
00297 
00298 int DayaBay::RpcSensor::panelColumn() const
00299 {
00300     return (this->sensorId()&0x00000f00)>>8;
00301 }
00302 
00303 int DayaBay::RpcSensor::layer() const
00304 {
00305     return (this->sensorId()&0x000000f0)>>4;
00306 }
00307 
00308 int DayaBay::RpcSensor::strip() const
00309 {
00310     return this->sensorId()&0x0000000f;
00311 }
00312 
00313 std::ostream& DayaBay::operator<<(std::ostream& str, 
00314                                   const DayaBay::RpcSensor& rpcsens)
00315 {
00316     str << Site::AsString(rpcsens.site())
00317         << DetectorId::AsString(rpcsens.detectorId())
00318         << "("
00319         <<rpcsens.panelRow()<<","
00320         <<rpcsens.panelColumn()<<","
00321         <<rpcsens.layer()<<","
00322         <<rpcsens.strip()<< ")";
00323     if (rpcsens.bogus()) str << " IS BOGUS";
00324     return str;
00325 }
00326 
00327 bool DayaBay::RpcSensor::bogus() const 
00328 {
00329     if (this->Detector::bogus()) return true;
00330     if (detectorId() != DetectorId::kRPC) {
00331         return true;
00332     }
00333 
00334     // fixme: fill in numerology
00335 }
| Classes | Job Modules | Data Objects | Services | Algorithms | Tools | Packages | Directories | Tracs |

Generated on Mon Apr 11 20:14:47 2011 for Conventions by doxygen 1.4.7