00001
00002
00003
00004
00005
00006
00007 #include "CalibFormats/SiPixelObjects/interface/PixelModuleName.h"
00008 #include <string>
00009 #include <iostream>
00010 #include <sstream>
00011 #include <fstream>
00012 #include <cctype>
00013 #include <cstdlib>
00014
00015 using namespace std;
00016 using namespace pos;
00017
00018
00019 PixelModuleName::PixelModuleName():
00020 id_(0)
00021 {}
00022
00023
00024 PixelModuleName::PixelModuleName(PixelROCName roc)
00025 {
00026
00027 unsigned int id=roc.id();
00028 unsigned int idtmp=(id&0x1FFFFFFF)>>4;
00029 if ((id&0x80000000)==0) idtmp=(idtmp&0xFFFFFFFC);
00030
00031 id_=idtmp|(id&0xE0000000);
00032
00033 }
00034
00035
00036 PixelModuleName::PixelModuleName(string modulename)
00037 {
00038
00039 parsename(modulename);
00040
00041 }
00042
00043 void PixelModuleName::setIdFPix(char np, char LR,int disk,
00044 int blade, int panel){
00045
00046 std::string mthn = "[PixelModuleName::setIdFPix()]\t\t\t " ;
00047 id_=0;
00048
00049
00050
00051
00052
00053
00054
00055 if (np=='p') id_=(id_|0x40000000);
00056
00057 if (LR=='I') id_=(id_|0x20000000);
00058
00059 id_=(id_|(disk<<8));
00060
00061 id_=(id_|(blade<<3));
00062
00063 id_=(id_|((panel-1)<<2));
00064
00065
00066 }
00067
00068
00069 void PixelModuleName::setIdBPix(char np, char LR,int sec,
00070 int layer, int ladder, char HF,
00071 int module){
00072
00073 std::string mthn = "[PixelModuleName::setIdBPix()]\t\t\t " ;
00074 id_=0;
00075
00076
00077
00078
00079
00080
00081
00082 id_=0x80000000;
00083
00084 if (np=='p') id_=(id_|0x40000000);
00085
00086 if (LR=='I') id_=(id_|0x20000000);
00087
00088 id_=(id_|((sec-1)<<10));
00089
00090 if (HF=='F') id_=(id_|0x00000080);
00091
00092 id_=(id_|(layer<<8));
00093
00094 id_=(id_|(ladder<<2));
00095
00096 id_=(id_|((module-1)));
00097
00098
00099 }
00100
00101 void PixelModuleName::check(bool check, const string& name){
00102
00103 std::string mthn = "[PixelModuleName::check()]\t\t\t " ;
00104 if (check) return;
00105
00106 cout << __LINE__ << "]\t" << mthn << "ERROR tried to parse string: '" << name ;
00107 cout << "' as a module name. Will terminate." << endl;
00108
00109 ::abort();
00110
00111 }
00112
00113 void PixelModuleName::parsename(string name){
00114
00115
00116
00117
00118
00119
00120
00121
00122
00123 check(name[0]=='F'||name[0]=='B',name);
00124
00125 if (name[0]=='F'){
00126 check(name[0]=='F',name);
00127 check(name[1]=='P',name);
00128 check(name[2]=='i',name);
00129 check(name[3]=='x',name);
00130 check(name[4]=='_',name);
00131 check(name[5]=='B',name);
00132 check((name[6]=='m')||(name[6]=='p'),name);
00133 char np=name[6];
00134 check((name[7]=='I')||(name[7]=='O'),name);
00135 char LR=name[7];
00136 check(name[8]=='_',name);
00137 check(name[9]=='D',name);
00138 char digit[2]={0,0};
00139 digit[0]=name[10];
00140 int disk=atoi(digit);
00141 check(name[11]=='_',name);
00142 check(name[12]=='B',name);
00143 check(name[13]=='L',name);
00144 check(name[14]=='D',name);
00145 check(isdigit(name[15]),name);
00146 digit[0]=name[15];
00147 int bld=atoi(digit);
00148 unsigned int offset=0;
00149 if (isdigit(name[16])){
00150 digit[0]=name[16];
00151 bld=10*bld+atoi(digit);
00152 offset++;
00153 }
00154
00155 check(name[16+offset]=='_',name);
00156 check(name[17+offset]=='P',name);
00157 check(name[18+offset]=='N',name);
00158 check(name[19+offset]=='L',name);
00159 check(isdigit(name[20+offset]),name);
00160 digit[0]=name[20+offset];
00161 int pnl=atoi(digit);
00162
00163 setIdFPix(np,LR,disk,bld,pnl);
00164 }
00165 else{
00166 check(name[0]=='B',name);
00167 check(name[1]=='P',name);
00168 check(name[2]=='i',name);
00169 check(name[3]=='x',name);
00170 check(name[4]=='_',name);
00171 check(name[5]=='B',name);
00172 check((name[6]=='m')||(name[6]=='p'),name);
00173 char np=name[6];
00174 check((name[7]=='I')||(name[7]=='O'),name);
00175 char LR=name[7];
00176 check(name[8]=='_',name);
00177 check(name[9]=='S',name);
00178 check(name[10]=='E',name);
00179 check(name[11]=='C',name);
00180 char digit[2]={0,0};
00181 digit[0]=name[12];
00182 int sec=atoi(digit);
00183 check(name[13]=='_',name);
00184 check(name[14]=='L',name);
00185 check(name[15]=='Y',name);
00186 check(name[16]=='R',name);
00187 check(isdigit(name[17]),name);
00188 digit[0]=name[17];
00189 int layer=atoi(digit);
00190 check(name[18]=='_',name);
00191 check(name[19]=='L',name);
00192 check(name[20]=='D',name);
00193 check(name[21]=='R',name);
00194 check(isdigit(name[22]),name);
00195 digit[0]=name[22];
00196 int ladder=atoi(digit);
00197 unsigned int offset=0;
00198 if (isdigit(name[23])){
00199 offset++;
00200 digit[0]=name[22+offset];
00201 ladder=10*ladder+atoi(digit);
00202 }
00203 check(name[23+offset]=='H'||name[23+offset]=='F',name);
00204 char HF=name[23+offset];
00205 check(name[24+offset]=='_',name);
00206 check(name[25+offset]=='M',name);
00207 check(name[26+offset]=='O',name);
00208 check(name[27+offset]=='D',name);
00209 check(isdigit(name[28+offset]),name);
00210 digit[0]=name[28+offset];
00211 int module=atoi(digit);
00212 setIdBPix(np,LR,sec,layer,ladder,HF,module);
00213 }
00214
00215 }
00216
00217 PixelModuleName::PixelModuleName(ifstream& s){
00218
00219 string tmp;
00220
00221 s >> tmp;
00222
00223 parsename(tmp);
00224
00225 }
00226
00227
00228 string PixelModuleName::modulename() const{
00229
00230 string s;
00231
00232 std::ostringstream s1;
00233
00234 if (detsub()=='F') {
00235 s1<<"FPix";
00236 s1<<"_B";
00237 s1<<mp();
00238 s1<<IO();
00239 s1<<"_D";
00240 s1<<disk();
00241 s1<<"_BLD";
00242 s1<<blade();
00243 s1<<"_PNL";
00244 s1<<panel();
00245
00246 }
00247 else{
00248 s1<<"BPix";
00249 s1<<"_B";
00250 s1<<mp();
00251 s1<<IO();
00252 s1<<"_SEC";
00253 s1<<sec();
00254 s1<<"_LYR";
00255 s1<<layer();
00256 s1<<"_LDR";
00257 s1<<ladder();
00258 s1<<HF();
00259 s1<<"_MOD";
00260 s1<<module();
00261
00262 }
00263
00264 s=s1.str();
00265
00266 return s;
00267
00268 }
00269
00270
00271
00272 ostream& pos::operator<<(ostream& s, const PixelModuleName& pixelroc){
00273
00274
00275
00276
00277 s<<pixelroc.modulename();
00278
00279 return s;
00280 }
00281
00282
00283 const PixelModuleName& PixelModuleName::operator=(const PixelModuleName& aROC){
00284
00285 id_=aROC.id_;
00286
00287 return *this;
00288
00289 }