00001 #include "DataFormats/SiPixelDetId/interface/PixelEndcapName.h"
00002
00003 #include <sstream>
00004
00005 #include "DataFormats/SiPixelDetId/interface/PXFDetId.h"
00006
00007 #include "FWCore/MessageLogger/interface/MessageLogger.h"
00008
00009 using namespace std;
00010
00011 PixelEndcapName::PixelEndcapName(const DetId & id)
00012 : PixelModuleName(false)
00013 {
00014 PXFDetId cmssw_numbering(id);
00015 int side = cmssw_numbering.side();
00016
00017 int tmpBlade = cmssw_numbering.blade();
00018 bool outer = false;
00019 if (tmpBlade >= 7 && tmpBlade <= 18) {
00020 outer = true;
00021 theBlade = tmpBlade-6;
00022 } else if( tmpBlade <=6 ) {
00023 theBlade = 7-tmpBlade;
00024 } else if( tmpBlade >= 19) {
00025 theBlade = 31-tmpBlade;
00026 }
00027
00028
00029 if( side == 1 && outer ) thePart = mO;
00030 else if( side == 1 && !outer ) thePart = mI;
00031 else if( side == 2 && outer ) thePart = pO;
00032 else if( side == 2 && !outer ) thePart = pI;
00033
00034
00035 theDisk = cmssw_numbering.disk();
00036 thePannel = cmssw_numbering.panel();
00037 thePlaquette = cmssw_numbering.module();
00038 }
00039
00040
00041 PixelEndcapName::PixelEndcapName(std::string name)
00042 : PixelModuleName(false), thePart(mO), theDisk(0),
00043 theBlade(0), thePannel(0), thePlaquette(0) {
00044
00045
00046
00047
00048 if ( (name.substr(0, 5) != "FPix_") ||
00049 (name.find("_B") == string::npos) ||
00050 (name.find("_D") == string::npos) ||
00051 (name.find("_BLD") == string::npos) ||
00052 (name.find("_PNL") == string::npos) ||
00053 (name.find("_PLQ") == string::npos) ) {
00054 edm::LogError ("BadNameString|SiPixel")
00055 << "Bad name string in PixelEndcapName::PixelEndcapName(std::string): "
00056 << name;
00057 return;
00058 }
00059
00060
00061 if (name.find("_ROC") != string::npos)
00062 name = name.substr(0, name.find("_ROC"));
00063
00064
00065 string hcString = name.substr(name.find("_B")+2, name.find("_D")-name.find("_B")-2);
00066 if (hcString == "mO") thePart = mO;
00067 else if (hcString == "mI") thePart = mI;
00068 else if (hcString == "pO") thePart = pO;
00069 else if (hcString == "pI") thePart = pI;
00070 else {
00071 edm::LogError ("BadNameString|SiPixel")
00072 << "Unable to determine half cylinder in PixelEndcapName::PixelEndcapName(std::string): "
00073 << name;
00074 }
00075
00076
00077 string diskString = name.substr(name.find("_D")+2, name.find("_BLD")-name.find("_D")-2);
00078 if (diskString == "1") theDisk = 1;
00079 else if (diskString == "2") theDisk = 2;
00080 else if (diskString == "3") theDisk = 3;
00081 else {
00082 edm::LogError ("BadNameString|SiPixel")
00083 << "Unable to determine disk number in PixelEndcapName::PixelEndcapName(std::string): "
00084 << name;
00085 }
00086
00087
00088 string bladeString = name.substr(name.find("_BLD")+4, name.find("_PNL")-name.find("_BLD")-4);
00089
00090 if (bladeString == "1") theBlade = 1;
00091 else if (bladeString == "2") theBlade = 2;
00092 else if (bladeString == "3") theBlade = 3;
00093 else if (bladeString == "4") theBlade = 4;
00094 else if (bladeString == "5") theBlade = 5;
00095 else if (bladeString == "6") theBlade = 6;
00096 else if (bladeString == "7") theBlade = 7;
00097 else if (bladeString == "8") theBlade = 8;
00098 else if (bladeString == "9") theBlade = 9;
00099 else if (bladeString == "10") theBlade = 10;
00100 else if (bladeString == "11") theBlade = 11;
00101 else if (bladeString == "12") theBlade = 12;
00102 else {
00103 edm::LogError ("BadNameString|SiPixel")
00104 << "Unable to determine blade number in PixelEndcapName::PixelEndcapName(std::string): "
00105 << name;
00106 }
00107
00108
00109 string panelString = name.substr(name.find("_PNL")+4, name.find("_PLQ")-name.find("_PNL")-4);
00110 if (panelString == "1") thePannel = 1;
00111 else if (panelString == "2") thePannel = 2;
00112 else {
00113 edm::LogError ("BadNameString|SiPixel")
00114 << "Unable to determine panel number in PixelEndcapName::PixelEndcapName(std::string): "
00115 << name;
00116 }
00117
00118
00119 string plaquetteString = name.substr(name.find("_PLQ")+4, name.size()-name.find("_PLQ")-4);
00120 if (plaquetteString == "1") thePlaquette = 1;
00121 else if (plaquetteString == "2") thePlaquette = 2;
00122 else if (plaquetteString == "3") thePlaquette = 3;
00123 else if (plaquetteString == "4") thePlaquette = 4;
00124 else {
00125 edm::LogError ("BadNameString|SiPixel")
00126 << "Unable to determine plaquette number in PixelEndcapName::PixelEndcapName(std::string): "
00127 << name;
00128 }
00129
00130 }
00131
00132 PixelModuleName::ModuleType PixelEndcapName::moduleType() const
00133 {
00134 ModuleType type = v1x2;
00135 if (pannelName() == 1) {
00136 if (plaquetteName() == 1) { type = v1x2; }
00137 else if (plaquetteName() == 2) { type = v2x3; }
00138 else if (plaquetteName() == 3) { type = v2x4; }
00139 else if (plaquetteName() == 4) { type = v1x5; }
00140 }
00141 else {
00142 if (plaquetteName() == 1) { type = v2x3; }
00143 else if (plaquetteName() == 2) { type = v2x4; }
00144 else if (plaquetteName() == 3) { type = v2x5; }
00145 }
00146 return type;
00147 }
00148
00149 bool PixelEndcapName::operator== (const PixelModuleName & o) const
00150 {
00151 if (!o.isBarrel()) {
00152 const PixelEndcapName * other = dynamic_cast<const PixelEndcapName *>(&o);
00153 return ( other
00154 && thePart == other->thePart
00155 && theDisk == other->theDisk
00156 && theBlade == other->theBlade
00157 && thePannel == other->thePannel
00158 && thePlaquette == other->thePlaquette );
00159 } else return false;
00160 }
00161
00162
00163 string PixelEndcapName::name() const
00164 {
00165 std::ostringstream stm;
00166 stm <<"FPix_B"<<thePart<<"_D"<<theDisk<<"_BLD"<<theBlade<<"_PNL"<<thePannel<<"_PLQ"<<thePlaquette;
00167 return stm.str();
00168 }
00169
00170 std::ostream & operator<<( std::ostream& out, const PixelEndcapName::HalfCylinder& t)
00171 {
00172 switch (t) {
00173 case(PixelEndcapName::pI) : {out << "pI"; break;}
00174 case(PixelEndcapName::pO) : {out << "pO"; break;}
00175 case(PixelEndcapName::mI) : {out << "mI"; break;}
00176 case(PixelEndcapName::mO) : {out << "mO"; break;}
00177 default: out << "unknown";
00178 };
00179 return out;
00180 }
00181
00182
00183 PXFDetId PixelEndcapName::getDetId() {
00184
00185 uint32_t side = 0;
00186 uint32_t disk = 0;
00187 uint32_t blade = 0;
00188 uint32_t panel = 0;
00189 uint32_t module = 0;
00190
00191
00192 HalfCylinder hc = halfCylinder();
00193 if (hc == mO || hc == mI) side = 1;
00194 else if (hc == pO || hc == pI) side = 2;
00195
00196
00197 disk = static_cast<uint32_t>(diskName());
00198 uint32_t tmpBlade = static_cast<uint32_t>(bladeName());
00199 panel = static_cast<uint32_t>(pannelName());
00200 module = static_cast<uint32_t>(plaquetteName());
00201
00202
00203 bool outer = false;
00204 outer = (hc == mO) || (hc == pO);
00205 if (outer) {
00206 blade = tmpBlade + 6;
00207 }
00208 else {
00209 if (tmpBlade <= 6) blade = 7 - tmpBlade;
00210 else if (tmpBlade <= 12) blade = 31 - tmpBlade;
00211 }
00212
00213
00214 return PXFDetId(side, disk, blade, panel, module);
00215
00216 }