CMS 3D CMS Logo

/data/doxygen/doxygen-1.7.3/gen/CMSSW_4_2_8/src/CalibFormats/SiPixelObjects/src/PixelModuleName.cc

Go to the documentation of this file.
00001 //
00002 // This class stores the name and related
00003 // hardware mapings for a module
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     //cout<< __LINE__ << "]\t" << mthn << "subdet: " << subdet <<endl; 
00050     //cout<< __LINE__ << "]\t" << mthn << "np    : " << np     <<endl; 
00051     //cout<< __LINE__ << "]\t" << mthn << "LR    : " << LR     <<endl; 
00052     //cout<< __LINE__ << "]\t" << mthn << "disk  : " << disk   <<endl; 
00053 
00054     
00055     if (np=='p') id_=(id_|0x40000000);
00056     //cout<< __LINE__ << "]\t" << mthn <<"2 id_=" << hex << id_ << dec << endl;
00057     if (LR=='I') id_=(id_|0x20000000);
00058     //cout<< __LINE__ << "]\t" << mthn <<"3 id_=" << hex << id_ << dec << endl;
00059     id_=(id_|(disk<<8));
00060     //cout<< __LINE__ << "]\t" << mthn <<"4 id_=" << hex << id_ << dec << endl;
00061     id_=(id_|(blade<<3));
00062     //cout<< __LINE__ << "]\t" << mthn <<"5 id_=" << hex << id_ << dec << endl;
00063     id_=(id_|((panel-1)<<2));
00064     //cout<< __LINE__ << "]\t" << mthn <<"6 id_=" << hex << id_ << dec << endl;
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     //cout<< __LINE__ << "]\t" << mthn << "BPix ladder: " << ladder << endl;
00077     //cout<< __LINE__ << "]\t" << mthn << "np         : " << np     << endl;
00078     //cout<< __LINE__ << "]\t" << mthn << "LR         : " << LR     << endl;
00079     //cout<< __LINE__ << "]\t" << mthn << "disk       : " << disk   << endl;
00080 
00081     
00082     id_=0x80000000;
00083 
00084     if (np=='p') id_=(id_|0x40000000);
00085     //cout<< __LINE__ << "]\t" << mthn <<"2 id_=" << hex << id_ << dec << endl;
00086     if (LR=='I') id_=(id_|0x20000000);
00087     //cout<< __LINE__ << "]\t" << mthn <<"3 id_=" << hex << id_ << dec << endl;
00088     id_=(id_|((sec-1)<<10));
00089     //cout<< __LINE__ << "]\t" << mthn <<"4 id_=" << hex << id_ << dec << endl;
00090     if (HF=='F') id_=(id_|0x00000080);
00091 
00092     id_=(id_|(layer<<8));
00093     //cout<< __LINE__ << "]\t" << mthn <<"5 id_=" << hex << id_ << dec << endl;
00094     id_=(id_|(ladder<<2));
00095     //cout<< __LINE__ << "]\t" << mthn <<"6 id_=" << hex << id_ << dec << endl;
00096     id_=(id_|((module-1)));
00097     //cout<< __LINE__ << "]\t" << mthn <<"7 id_=" << hex << id_ << dec << endl;
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     // The name should be on the format
00117     //
00118     // FPix_BpR_D1_BLD1_PNL1
00119     //
00120 
00121     //cout << "ROC name:"<<name<<endl;
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     // FPix_BpR_D1_BLD1_PNL1_PLQ1_ROC1
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 }