00001 #ifndef _TrackerMap_h_
00002 #define _TrackerMap_h_
00003 #include <utility>
00004 #include <string>
00005 #include <iostream>
00006 #include <fstream>
00007 #include <sstream>
00008 #include <cmath>
00009 #include <map>
00010 #include "FWCore/ParameterSet/interface/ParameterSet.h"
00011 #include "FWCore/Framework/interface/ESHandle.h"
00012 #include "CondFormats/SiStripObjects/interface/SiStripFedCabling.h"
00013 #include "TColor.h"
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040 #define NUMPSUCH_INROW 18
00041 #define NUMPSUCRATE_INCOLUMN 5
00042 #define NUMPSURACK_INCOLUMN 6
00043 #define NUMPSURACK_INROW 5
00044 #define XPSURSIZE 150 // (5)*1.5 boxes
00045 #define YPSURSIZE 360 // 18 boxes
00046 #define XPSUOFFSET 50
00047 #define YPSUOFFSET 100
00048
00049 #define NUMFEDCH_INCOLUMN 12
00050 #define NUMFEDCH_INROW 8
00051 #define NUMFED_INCOLUMN 21
00052 #define NUMFED_INROW 1
00053
00054
00055 #define NUMFEDCRATE_INCOLUMN 1
00056 #define NUMFEDCRATE_INROW 31
00057
00058
00059 #define XFEDCSIZE 2940 // 14*21 boxes
00060 #define YFEDCSIZE 90 // 9 boxes
00061 #define XFEDOFFSET 150
00062 #define YFEDOFFSET 100
00063
00064 class TmModule;
00065 class TmApvPair;
00066 class EventSetup;
00067 class TmCcu;
00068 class TmPsu;
00069
00070 class TrackerMap {
00071 public:
00072
00073 TrackerMap(std::string s=" ",int xsize1=340,int ysize1=200);
00074 TrackerMap(const edm::ParameterSet & iConfig);
00075 TrackerMap(const edm::ParameterSet & iConfig,const SiStripFedCabling* tkFed);
00076 ~TrackerMap();
00077
00078 void build();
00079 void init();
00080 void drawModule(TmModule * mod, int key, int layer, bool total, std::ofstream * file);
00081 void print(bool print_total=true,float minval=0., float maxval=0.,std::string s="svgmap");
00082 void printall(bool print_total=true,float minval=0., float maxval=0.,std::string s="svgmap",int width=6000, int height=3200);
00083 void printonline();
00084 void printlayers(bool print_total=true,float minval=0., float maxval=0.,std::string s="layer");
00085 void save(bool print_total=true,float minval=0., float maxval=0.,std::string s="svgmap.svg",int width=1500, int height=800);
00086 void save_as_fedtrackermap(bool print_total=true,float minval=0., float maxval=0.,std::string s="fed_svgmap.svg",
00087 int width=YFEDOFFSET+(YFEDCSIZE+YFEDOFFSET)*NUMFEDCRATE_INROW+300,
00088 int height=XFEDOFFSET+(XFEDCSIZE+XFEDOFFSET)*NUMFEDCRATE_INCOLUMN+300);
00089 void save_as_fectrackermap(bool print_total=true,float minval=0., float maxval=0.,std::string s="fec_svgmap.svg",int width=1500, int height=800);
00090 void save_as_psutrackermap(bool print_total=true,float minval=0., float maxval=0.,std::string s="psu_svgmap.svg",
00091 int width=YPSUOFFSET+(YPSURSIZE+YPSUOFFSET)*NUMPSURACK_INROW+300,
00092 int height=XPSUOFFSET+(XPSURSIZE+XPSUOFFSET)*NUMPSURACK_INCOLUMN+300);
00093 void save_as_HVtrackermap(bool print_total=true,float minval=0., float maxval=0.,std::string s="psu_svgmap.svg",int width=1500, int height=800);
00094 void drawApvPair( int crate, int numfed_incrate, bool total, TmApvPair* apvPair,std::ofstream * file,bool useApvPairValue);
00095 void drawCcu( int crate, int numfed_incrate, bool total, TmCcu* ccu,std::ofstream * file,bool useCcuValue);
00096 void drawPsu(int rack,int numcrate_inrack, bool print_total, TmPsu* psu,ofstream * svgfile,bool usePsuValue);
00097 void drawHV2(int rack,int numcrate_inrack, bool print_total, TmPsu* psu,ofstream * svgfile,bool usePsuValue);
00098 void drawHV3(int rack,int numcrate_inrack, bool print_total, TmPsu* psu,ofstream * svgfile,bool usePsuValue);
00099 void fill_current_val(int idmod, float current_val );
00100 void fill(int layer , int ring, int nmod, float x );
00101 void fill(int idmod, float qty );
00102 void fillc(int idmod, int RGBcode) {fillc(idmod,(RGBcode>>16) & 0xFF , (RGBcode>>8) & 0xFF, RGBcode & 0xFF);}
00103 void fillc(int idmod, int red, int green, int blue);
00104 void fillc(int layer,int ring, int nmod, int red, int green, int blue);
00105 void fillc_all_blank();
00106 void fill_all_blank();
00107 void fill_current_val_fed_channel(int fedId,int fedCh, float current_val );
00108 void fill_fed_channel(int fedId,int fedCh, float qty );
00109 void fill_fed_channel(int modId, float qty );
00110 void fillc_fed_channel(int fedId,int fedCh, int red, int green, int blue);
00111 void fillc_fec_channel(int crate,int slot, int ring, int addr, int red, int green, int blue );
00112 void fill_fec_channel(int crate,int slot, int ring, int addr, float qty );
00113 void fill_lv_channel(int rack,int crate, int board, float qty );
00114 void fillc_lv_channel(int rack,int crate, int board, int red, int green, int blue);
00115 void fill_hv_channel2(int rack,int crate, int board, float qty );
00116 void fillc_hv_channel2(int rack,int crate, int board, int red, int green, int blue);
00117 void fill_hv_channel3(int rack,int crate, int board, float qty );
00118 void fillc_hv_channel3(int rack,int crate, int board, int red, int green, int blue);
00119 int module(int fedId,int fedCh);
00120 void setText(int idmod , std::string s );
00121 void setText(int layer, int ring, int nmod , std::string s );
00122 void setPalette(int numpalette){palette=numpalette;}
00123 void drawPalette(std::ofstream * file, int xoffset=3660, int yoffset=1540);
00124 void showPalette(bool printflag1){printflag=printflag1;};
00125 void setTitle(std::string s){title=s;};
00126 void setRange(float min,float max);
00127 std::pair<float,float>getAutomaticRange();
00128 void addPixel(bool addPixelfl){addPixelFlag=addPixelfl;};
00129 void reset();
00130 void load(std::string s="tmap.svg");
00131 int getxsize(){return xsize;};
00132 int getysize(){return ysize;};
00133 int getcolor(float value, int palette);
00134 std::ifstream * findfile(std::string filename);
00135 int getNumMod(){return number_modules;};
00136 std::vector<TColor*> vc;
00137 typedef std::map<const int , TmModule *> SmoduleMap;
00138 SmoduleMap smoduleMap;
00139 typedef std::map<const int , TmModule *> ImoduleMap;
00140 ImoduleMap imoduleMap;
00141 typedef std::map<const int , TmApvPair*> SvgApvPair;
00142 SvgApvPair apvMap;
00143 typedef std::multimap<const int , TmApvPair*> ModApvPair;
00144 ModApvPair apvModuleMap;
00145 typedef std::map<const int , int> SvgFed;
00146 SvgFed fedMap;
00147 SvgFed slotMap;
00148 typedef std::map<const int , TmCcu*> MapCcu;
00149 MapCcu ccuMap;
00150 typedef std::multimap<TmCcu* , TmModule*> FecModule;
00151 FecModule fecModuleMap;
00152 typedef std::map<const int , TmPsu*> MapPsu;
00153 MapPsu psuMap;
00154 typedef std::multimap<TmPsu* , TmModule*> PsuModule;
00155 PsuModule psuModuleMap;
00156 int palette;
00157 bool printflag;
00158 bool saveWebInterface;
00159 bool saveGeoTrackerMap;
00160 bool enableFedProcessing;
00161 bool enableFecProcessing;
00162 bool enableLVProcessing;
00163 bool enableHVProcessing;
00164 bool tkMapLog;
00165 int ndet;
00166 int npart;
00167 std::string title;
00168 std::string jsfilename,infilename;
00169 std::string jsPath;
00170 bool psetAvailable;
00171 double phival(double x, double y){
00172 double phi;
00173 double phi1=atan(y/x);
00174 phi = phi1;
00175 if(y<0. && x>0) phi = phi1+2.*M_PI;
00176 if(x<0.)phi=phi1+M_PI;
00177 if(fabs(y)<0.000001 && x>0)phi=0;
00178 if(fabs(y)<0.000001&&x<0)phi=M_PI;
00179 if(fabs(x)<0.000001&&y>0)phi=M_PI/2.;
00180 if(fabs(x)<0.000001&&y<0)phi=3.*M_PI/2.;
00181
00182 return phi;
00183 }
00184
00185 int find_layer(int ix, int iy)
00186 {
00187 int add;
00188 int layer=0;
00189 if(iy <= xsize){
00190 add = 15;
00191 layer = ix/ysize;
00192 layer = layer+add+1;
00193 }
00194 if(iy > xsize && iy< 3*xsize){
00195 add=30;
00196 if(ix < 2*ysize){
00197 layer=1;
00198 }else {
00199 layer = ix/(2*ysize);
00200 if(iy < 2*xsize)layer=layer*2+1; else layer=layer*2;
00201 }
00202 layer = layer+add;
00203 }
00204 if(iy >= 3*xsize){
00205 layer = ix/ysize;
00206 layer = 15-layer;
00207 }
00208 return layer;
00209 }
00210
00211 int getlayerCount(int subdet, int partdet){
00212 int ncomponent=0;
00213 if(subdet == 1){
00214 if(partdet == 1 || partdet == 3){
00215 ncomponent = 3;
00216 }
00217 else { ncomponent = 3; }
00218 }
00219 if(subdet== 2){
00220 if(partdet == 1 || partdet == 3){
00221 ncomponent = 3;
00222 }
00223 else { ncomponent = 4; }
00224 }
00225 if(subdet== 3){
00226 if(partdet == 1 || partdet == 3){
00227 ncomponent = 9;
00228 }
00229 else { ncomponent = 6; }
00230 }
00231 return(ncomponent);
00232 }
00233 double xdpixel(double x){
00234 double res;
00235 if(saveAsSingleLayer)res= ((x-xmin)/(xmax-xmin)*xsize);
00236 else res= ((x-xmin)/(xmax-xmin)*xsize)+ix;
00237 return res;
00238 }
00239 double ydpixel(double y){
00240 double res=0;
00241 double y1;
00242 y1 = (y-ymin)/(ymax-ymin);
00243 if(nlay>30)
00244 {
00245 if(nlay <34) res= 2*ysize - (y1*2*ysize);
00246 if(nlay==34) res= 2.4*ysize - (y1*2.4*ysize);
00247 if(nlay>34) res= 2.5*ysize - (y1*2.5*ysize);
00248 }
00249 else res= xsize - (y1*xsize);
00250 if(!saveAsSingleLayer) res=res+iy;
00251 return res;
00252 }
00253 double xdpixelc(double x){
00254 double res;
00255 if(saveAsSingleLayer)res= ((x-xmin)/(xmax-xmin)*XFEDCSIZE);
00256 else res= ((x-xmin)/(xmax-xmin)*XFEDCSIZE)+ix;
00257 return res;
00258 }
00259 double ydpixelc(double y){
00260 double res;
00261 double y1;
00262 y1 = (y-ymin)/(ymax-ymin);
00263 if(saveAsSingleLayer)res= YFEDCSIZE - (y1*YFEDCSIZE);
00264 else res= YFEDCSIZE - (y1*YFEDCSIZE)+iy;
00265 return res;
00266 }
00267 double xdpixelfec(double x){
00268 double res;
00269 if(saveAsSingleLayer)res= ((x-xmin)/(xmax-xmin)*xsize);
00270 else res= ((x-xmin)/(xmax-xmin)*xsize)+ix;
00271 return res;
00272 }
00273 double ydpixelfec(double y){
00274 double res;
00275 double y1;
00276 y1 = (y-ymin)/(ymax-ymin);
00277 if(saveAsSingleLayer)res= 2*ysize - (y1*2*ysize);
00278 else res= 2*ysize - (y1*2*ysize)+iy;
00279 return res;
00280 }
00281 double xdpixelpsu(double x){
00282 double res;
00283 if(saveAsSingleLayer)res= ((x-xmin)/(xmax-xmin)*XPSURSIZE);
00284 else res= ((x-xmin)/(xmax-xmin)*XPSURSIZE)+ix;
00285 return res;
00286 }
00287 double ydpixelpsu(double y){
00288 double res;
00289 double y1;
00290 y1 = (y-ymin)/(ymax-ymin);
00291 if(saveAsSingleLayer)res=YPSURSIZE - (y1*YPSURSIZE);
00292 else res= YPSURSIZE - (y1*YPSURSIZE)+iy;
00293 return res;
00294 }
00295
00296 void defcwindow(int num_crate){
00297
00298 int xoffset=XFEDOFFSET;
00299 int yoffset=YFEDOFFSET;
00300 xmin=0.;xmax=(NUMFEDCH_INCOLUMN+2)*NUMFED_INCOLUMN; ymin = 0.; ymax=(NUMFEDCH_INROW+1)*NUMFED_INROW;
00301
00302 ix = xoffset+((NUMFEDCRATE_INCOLUMN-1)-((num_crate-1)%NUMFEDCRATE_INCOLUMN))*(XFEDCSIZE+XFEDOFFSET);
00303 iy = yoffset+((num_crate-1)/NUMFEDCRATE_INCOLUMN)*(YFEDCSIZE+YFEDOFFSET);
00304 }
00305 void deffecwindow(int num_crate){
00306
00307 int xoffset=xsize/3;
00308 int yoffset=2*ysize;
00309 xmin=-1.;xmax=37.; ymin = -10.; ymax=40.;
00310 if(num_crate==1||num_crate==3)ix = xoffset+xsize*2;
00311 if(num_crate==2||num_crate==4)ix = xoffset;
00312 iy = yoffset+((num_crate-1)/2)*ysize*4;
00313 }
00314 void defpsuwindow(int num_rack){
00315
00316 int xoffset=XPSUOFFSET;
00317 int yoffset=YPSUOFFSET;
00318 xmin=0; xmax=(NUMPSUCRATE_INCOLUMN)*1.5;
00319 ymin=0; ymax=NUMPSUCH_INROW;
00320
00321 ix = xoffset+((NUMPSURACK_INCOLUMN-1)-((num_rack-1)%NUMPSURACK_INCOLUMN))*(XPSURSIZE+XPSUOFFSET);
00322 iy = yoffset+((num_rack-1)/NUMPSURACK_INCOLUMN)*(YPSURSIZE+YPSUOFFSET);
00323 }
00324
00325
00326 void defwindow(int num_lay){
00327
00328 if(posrel){
00329 xmin=-2.;ymin=-2.;xmax=2.;ymax=2.;
00330 if(num_lay >12 && num_lay < 19){
00331 xmin=-.40;xmax=.40;ymin=-.40;ymax=.40;
00332 }
00333 if(num_lay>30){
00334 xmin=-0.1;xmax=3.;ymin=-0.1;ymax=8.5;
00335 if(num_lay<34){xmin=-0.3;xmax=1.0;}
00336 if(num_lay>33&&num_lay<38){xmax=2.0;}
00337 if(num_lay>37){ymax=8.;}
00338 }
00339 }else{
00340 xmin=-1.3;ymin=-1.3;xmax=1.3;ymax=1.3;
00341 if(num_lay >12 && num_lay < 19){
00342 xmin=-.20;xmax=.20;ymin=-.20;ymax=.20;
00343 }
00344 if(num_lay>30){
00345 xmin=-1.5;xmax=1.5;ymin=-1.;ymax=28.;
00346 if(num_lay<34){xmin=-0.5;xmax=0.5;}
00347 if(num_lay>33&&num_lay<38){xmin=-1.;xmax=1.;}
00348 }
00349
00350 }
00351 if(num_lay<16){
00352 ix=0;
00353 if(num_lay==15||num_lay==14)iy=(15-num_lay)*2*ysize; else
00354 {if(num_lay>9&&num_lay<13)iy=4*ysize-(int)(ysize/2.)+(12-num_lay)*(int)(ysize/1.50);else iy=6*ysize+(9-num_lay)*(int)(ysize*1.3);}}
00355 if(num_lay>15&&num_lay<31){
00356 ix=3*xsize;
00357 if(num_lay==16||num_lay==17)iy=(num_lay-16)*2*ysize; else
00358 {if(num_lay>18&&num_lay<22)iy=4*ysize-(int)(ysize/2.)+(num_lay-19)*(int)(ysize/1.50);else iy=6*ysize+(num_lay-22)*(int)(ysize*1.3);}}
00359 if(num_lay>30){
00360 if(num_lay==31){ix=(int)(1.5*xsize);iy=0;}
00361 if(num_lay==32){int il=(num_lay-30)/2;ix=xsize;iy=il*2*ysize;}
00362 if(num_lay==33){int il=(num_lay-30)/2;ix=2*xsize;iy=il*2*ysize;}
00363 if(num_lay==34){int il=(num_lay-30)/2;ix=xsize;iy=il*(int)(2.57*ysize);}
00364 if(num_lay>34 && num_lay%2==0){int il=(num_lay-30)/2;ix=xsize;iy=il*(int)(2.5*ysize);}
00365 if(num_lay>34 && num_lay%2!=0){int il=(num_lay-30)/2;ix=2*xsize;iy=il*(int)(2.5*ysize);}
00366 }
00367 }
00368
00369 int getringCount(int subdet, int partdet, int layer){
00370 int ncomponent=0;
00371 if(subdet== 1){
00372 if(partdet== 1 || partdet== 3){
00373 ncomponent = 7;
00374 }
00375 else{ncomponent = 8;}
00376 }
00377 if(subdet== 2){
00378 if(partdet== 1 || partdet== 3){
00379 ncomponent = 3;
00380 }
00381 else{ncomponent = 12;}
00382 }
00383 if(subdet== 3){
00384 if(partdet== 1){
00385 if (layer== 1) ncomponent = 4;
00386 if (layer== 2 || layer== 3) ncomponent = 5;
00387 if (layer== 4 || layer== 5 || layer== 6) ncomponent = 6;
00388 if (layer== 7 || layer== 8 || layer== 9) ncomponent = 7;
00389 }
00390 if(partdet== 3){
00391 if (layer== 9) ncomponent = 4;
00392 if (layer== 8 || layer== 7) ncomponent = 5;
00393 if (layer== 6 || layer== 5 || layer== 4) ncomponent = 6;
00394 if (layer== 3 || layer== 2 || layer== 1) ncomponent = 7;
00395 }
00396 if(partdet== 2){
00397 ncomponent = 12;
00398 }
00399 }
00400 return(ncomponent);
00401 }
00402 int getmoduleCount(int subdet, int partdet, int layer, int ring){
00403 int ncomponent=0;
00404 int spicchif[] ={24,24,40,56,40,56,80};
00405 int spicchib[] ={20,32,44,30,38,46,56,42,48,54,60,66,74};
00406 int numero_layer = 0;
00407
00408 if(partdet == 2){
00409 numero_layer = layer-1;
00410 if(subdet== 2){
00411 numero_layer = numero_layer+3;
00412 }
00413 if(subdet == 3){
00414 numero_layer = numero_layer+7;
00415 }
00416 ncomponent = spicchib[numero_layer];
00417 }
00418 if(partdet!= 2){
00419 if(subdet== 1)ncomponent=24;
00420 else
00421 ncomponent = spicchif[ring-1];
00422 }
00423 return(ncomponent);
00424 }
00425 static int layerno(int subdet,int leftright,int layer){
00426 if(subdet==6&&leftright==1)return(10-layer);
00427 if(subdet==6&&leftright==2)return(layer+21);
00428 if(subdet==4&&leftright==1)return(4-layer+9);
00429 if(subdet==4&&leftright==2)return(layer+18);
00430 if(subdet==2&&leftright==1)return(4-layer+12);
00431 if(subdet==2&&leftright==2)return(layer+15);
00432 if(subdet==1)return(layer+30);
00433 if(subdet==3)return(layer+33);
00434 if(subdet==5)return(layer+37);
00435 }
00436
00437 static bool isRingStereo(int key){
00438 int layer=key/100000;
00439 int ring = key - layer*100000;
00440 ring = ring/1000;
00441 if(layer==34 || layer==35 || layer==38 || layer==39) return true;
00442 if(layer<13 || (layer>18&&layer<31))
00443 if(ring==1 || ring==2 || ring==5)return true;
00444 return false;
00445 }
00446 int nlayer(int det,int part,int lay){
00447 if(det==3 && part==1) return lay;
00448 if(det==2 && part==1) return lay+9;
00449 if(det==1 && part==1) return lay+12;
00450 if(det==1 && part==3) return lay+15;
00451 if(det==2 && part==3) return lay+18;
00452 if(det==3 && part==3) return lay+21;
00453 if(det==1 && part==2) return lay+30;
00454 if(det==2 && part==2) return lay+33;
00455 if(det==3 && part==2) return lay+37;
00456 return -1;
00457 }
00458
00459 std::string layername(int layer){
00460 std::string s= " ";
00461 std::ostringstream ons;
00462
00463 if(layer < 10) ons << "TEC -z Layer " << layer;
00464 if(layer < 13 && layer > 9) ons << "TID -z Layer " << layer-9;
00465 if(layer < 16 && layer > 12) ons << "FPIX -z Layer " << layer-12;
00466 if(layer < 19 && layer > 15) ons << "FPIX +z Layer " << layer-15;
00467 if(layer < 22 && layer > 18) ons << "TID +z Layer " << layer-18;
00468 if(layer < 31 && layer > 21) ons << "TEC +z Layer " << layer-21;
00469 if(layer < 34 && layer > 30) ons << "TPB Layer " << layer-30;
00470 if(layer < 38 && layer > 33) ons << "TIB Layer " << layer-33;
00471 if(layer > 37) ons << "TOB Layer " << layer-37;
00472 s = ons.str();
00473 return s;
00474 }
00475 int ntotRing[43];
00476 int firstRing[43];
00477
00478 protected:
00479 int nlay;
00480
00481
00482 int ncrates;
00483 int firstcrate;
00484 int nfeccrates;
00485 int npsuracks;
00486 double xmin,xmax,ymin,ymax;
00487 int xsize,ysize,ix,iy;
00488 bool posrel;
00489 bool firstcall;
00490 std::ofstream * svgfile;
00491 std::ofstream * savefile;
00492 std::ifstream * jsfile;
00493 std::ifstream * inputfile;
00494 std::ifstream * ccufile;
00495 float gminvalue,gmaxvalue;
00496 float minvalue,maxvalue;
00497 int number_modules;
00498 bool temporary_file;
00499
00500 private:
00501
00502 float oldz;
00503 bool saveAsSingleLayer;
00504 bool addPixelFlag;
00505 };
00506 #endif
00507