CMS 3D CMS Logo

/data/refman/pasoursint/CMSSW_4_1_8_patch9/src/CommonTools/TrackerMap/src/TrackerMap.cc

Go to the documentation of this file.
00001 #include "CommonTools/TrackerMap/interface/TrackerMap.h"
00002 #include "CommonTools/TrackerMap/interface/TmModule.h"
00003 #include "FWCore/ParameterSet/interface/ParameterSet.h"
00004 #include "FWCore/ParameterSet/interface/FileInPath.h"
00005 #include "CondFormats/SiStripObjects/interface/FedChannelConnection.h"
00006 #include "CalibFormats/SiStripObjects/interface/SiStripFecCabling.h"
00007 #include "CommonTools/TrackerMap/interface/TmApvPair.h"
00008 #include "CommonTools/TrackerMap/interface/TmCcu.h"
00009 #include "CommonTools/TrackerMap/interface/TmPsu.h"
00010 #include <fstream>
00011 #include <vector>
00012 #include <iostream>
00013 #include <sstream>
00014 #include "TCanvas.h"
00015 #include "TPolyLine.h"
00016 #include "TStyle.h"
00017 #include "TColor.h"
00018 #include "TROOT.h"
00019 #include "TGaxis.h"
00020 #include "TLatex.h"
00021 #include "TArrow.h"
00022 
00023 
00024 /**********************************************************
00025 Allocate all the modules in a map of TmModule
00026 The filling of the values for each module is done later
00027 when the user starts to fill it.
00028 **********************************************************/
00029 
00030 TrackerMap::TrackerMap(const edm::ParameterSet & tkmapPset,const edm::ESHandle<SiStripFedCabling> tkFed) {
00031 
00032  psetAvailable=true;
00033   xsize=340;ysize=200;
00034   title=" ";
00035   jsPath="";
00036   jsfilename="CommonTools/TrackerMap/data/trackermap.txt";
00037   infilename="CommonTools/TrackerMap/data/tracker.dat";
00038   saveAsSingleLayer=false;
00039   if(tkmapPset.exists("trackermaptxtPath")){
00040   jsPath=tkmapPset.getUntrackedParameter<std::string>("trackermaptxtPath",""
00041 );
00042   jsfilename=jsPath+"trackermap.txt";
00043   std::cout << jsfilename << std::endl;
00044   infilename=tkmapPset.getUntrackedParameter<std::string>("trackerdatPath","")+"tracker.dat";
00045   std::cout << infilename << std::endl;
00046   ncrates=0;
00047   enableFedProcessing=tkmapPset.getUntrackedParameter<bool>("loadFedCabling",false);
00048   nfeccrates=0;
00049   enableFecProcessing=tkmapPset.getUntrackedParameter<bool>("loadFecCabling",false);
00050  // std::cout << "loadFecCabling " << enableFecProcessing << std::endl;
00051   npsuracks=0;
00052   enableLVProcessing=tkmapPset.getUntrackedParameter<bool>("loadLVCabling",false);
00053  // std::cout << "loadLVCabling " << enableLVProcessing << std::endl;
00054   enableHVProcessing=tkmapPset.getUntrackedParameter<bool>("loadHVCabling",false);
00055  // std::cout << "loadHVCabling " << enableHVProcessing << std::endl;
00056   } else std::cout << "no parameters found" << std::endl;
00057 
00058  init();
00059 // Now load fed cabling information
00060  if(enableFedProcessing){
00061  const std::vector<unsigned short> feds = tkFed->feds();
00062   std::cout<<"SiStripFedCabling has "<< feds.size()<<" active FEDS"<<std::endl;
00063     int num_board=0;
00064     int num_crate=0;
00065   for(std::vector<unsigned short>::const_iterator ifed = feds.begin();ifed<feds.end();ifed++){
00066     const std::vector<FedChannelConnection> theconn = tkFed->connections( *ifed );
00067     int num_conn=0;
00068     for(std::vector<FedChannelConnection>::const_iterator iconn = theconn.begin();iconn<theconn.end();iconn++){
00069 
00070       if( iconn->fedId()== sistrip::invalid_    ||  
00071           iconn->detId() == sistrip::invalid_   ||  
00072           iconn->detId() == sistrip::invalid32_ ||  
00073           iconn->apvPairNumber() == sistrip::invalid_  ||
00074           iconn->nApvPairs() == sistrip::invalid_ ) {
00075         continue;
00076       }
00077         
00078       TmModule *imod = imoduleMap[iconn->detId()];
00079       int key = iconn->fedId()*1000+iconn->fedCh();
00080       TmApvPair* apvpair = apvMap[key];
00081       if(apvpair!=0)std::cout << "Fed "<< iconn->fedId() << " channel " << iconn->fedCh() << " seem to be already loaded!"<<std::endl;
00082       else
00083         {
00084           num_conn++;
00085           if(num_conn==1){
00086             if(fedMap[iconn->fedId()]==0){num_crate=num_board/18+1;fedMap[iconn->fedId()]=num_crate;num_board++;}
00087           }
00088           apvpair = new TmApvPair(key,num_crate);
00089           apvpair->mod=imod;
00090           apvpair->mpos=iconn->apvPairNumber();
00091           apvMap[key] = apvpair;        
00092           apvModuleMap.insert(std::make_pair(iconn->detId(),apvpair));
00093           std::stringstream s;
00094           iconn->print(s);  
00095           apvpair->text=s.str();
00096         }
00097     }
00098   }
00099   ncrates=num_crate;
00100   std::cout << num_crate << " crates used "<< std::endl;
00101 //Now add APv information to module name
00102     std::map<int , TmModule *>::iterator i_mod;
00103     for( i_mod=imoduleMap.begin();i_mod !=imoduleMap.end(); i_mod++){
00104       TmModule *  mod= i_mod->second;
00105       if(mod!=0) {
00106         std::ostringstream outs,outs1;
00107        outs << " connected to ";
00108        outs1 << "(";
00109 
00110       int idmod=mod->idex;
00111        int nchan=0;
00112        std::multimap<const int, TmApvPair*>::iterator pos;
00113        for (pos = apvModuleMap.lower_bound(idmod);
00114          pos != apvModuleMap.upper_bound(idmod); ++pos) {
00115        TmApvPair* apvpair = pos->second;
00116        if(apvpair!=0){
00117        outs << apvpair->mpos << " " <<apvpair->getFedId() << "/"<<apvpair->getFedCh()<<" ";
00118        outs1 << apvpair->idex+apvpair->crate*1000000<<",";
00119       nchan++;
00120     }
00121 
00122   }
00123        outs<< "("<<nchan<<")";
00124       mod->name=mod->name + outs.str(); 
00125       std::string s = outs1.str(); s.erase(s.end()-1,s.end());
00126       mod->capvids=s+")";
00127   }
00128   }
00129 }
00130 // Now load fec cabling information
00131  if(enableFecProcessing){
00132    int nfec=0; int nccu; int nmod;
00133    int crate,slot,ring,addr,pos;
00134    SiStripFecCabling* fecCabling_;
00135    fecCabling_ = new SiStripFecCabling( *tkFed );
00136    std::string Ccufilename=tkmapPset.getUntrackedParameter<std::string>("trackerdatPath","")+"cculist.txt";
00137    ifstream Ccufile(edm::FileInPath(Ccufilename).fullPath().c_str(),std::ios::in);
00138    std::string dummys;
00139    while(!Ccufile.eof()) {
00140      Ccufile >> crate >> slot >> ring >> addr >> pos;
00141      getline(Ccufile,dummys);
00142      int key =crate*10000000+slot*100000+ring*1000+addr;
00143      TmCcu * ccu = ccuMap[key];
00144      if(ccu==0){
00145        ccu = new TmCcu(crate,slot,ring,addr);
00146        ccu->mpos=pos,
00147          ccuMap[key]=ccu;
00148      }
00149    }
00150 
00151    for ( std::vector<SiStripFecCrate>::const_iterator icrate = fecCabling_->crates().begin(); icrate != fecCabling_->crates().end(); icrate++ ) {
00152      for ( std::vector<SiStripFec>::const_iterator ifec = icrate->fecs().begin(); ifec != icrate->fecs().end(); ifec++ ) {
00153        for ( std::vector<SiStripRing>::const_iterator iring = ifec->rings().begin(); iring != ifec->rings().end(); iring++ ) {
00154          nccu=0;nfec++;
00155          for ( std::vector<SiStripCcu>::const_iterator iccu = iring->ccus().begin(); iccu != iring->ccus().end(); iccu++ ) {
00156            nccu++; nmod=0;
00157            int key = icrate->fecCrate()*10000000+ifec->fecSlot()*100000+iring->fecRing()*1000+iccu->ccuAddr();
00158            int layer=0;
00159            TmCcu * ccu = ccuMap[key];
00160            for ( std::vector<SiStripModule>::const_iterator imod = iccu->modules().begin(); imod != iccu->modules().end(); imod++ ) {
00161              nmod++;
00162              TmModule *imod1 = imoduleMap[imod->detId()];
00163              layer=imod1->layer;
00164              fecModuleMap.insert(std::make_pair(ccu,imod1));
00165              if(imod1!=0)imod1->CcuId=key;//imod1->ccuId=key+Crate*1000000
00166            }
00167            if(ccu==0)std::cout <<key<< " This ccu seems to have not been stored! " << std::endl; else{ ccu->nmod=nmod;ccu->layer=layer;}
00168            //std::cout <<nfec<<" "<< nccu << " " << nmod << std::endl;
00169 
00170          }
00171        }
00172      }
00173    }
00174 
00175    std::map<int , TmCcu *>::iterator i_ccu;
00176    std::multimap<TmCcu*, TmModule*>::iterator it;
00177    std::pair<std::multimap<TmCcu*, TmModule*>::iterator,std::multimap<TmCcu*, TmModule*>::iterator> ret;
00178    nccu=0;
00179    for( i_ccu=ccuMap.begin();i_ccu !=ccuMap.end(); i_ccu++){
00180      TmCcu *  ccu= i_ccu->second;
00181      nccu++;
00182      if(ccu!=0){
00183        std::ostringstream outs;
00184        std::ostringstream outs1;
00185        outs << "CCU "<<ccu->idex <<" connected to fec,ring " << ccu->getCcuSlot() <<","<<ccu->getCcuRing()<< " in crate " <<ccu->getCcuCrate()<<" at position "<< ccu->mpos << " with  " << ccu->nmod << " modules: ";
00186         outs1<<"(";
00187         ret = fecModuleMap.equal_range(ccu);
00188         for (it = ret.first; it != ret.second; ++it)
00189           {
00190             outs << (*it).second->idex << " ";
00191             outs1 << (*it).second->getKey() <<",";
00192           }
00193         outs1 << ")";
00194         ccu->text=outs.str();
00195         ccu->cmodid=outs1.str();
00196         //std::cout << ccu->text << std::endl;
00197      }
00198 
00199    }
00200    nfeccrates=4;
00201    std::cout << nccu << " ccu stored in " <<nfeccrates<< " crates"<< std::endl;
00202 
00203    delete fecCabling_ ;
00204 
00205  }
00206 //load Psu cabling info
00207  //load Psu cabling info 
00208  if(enableLVProcessing || enableHVProcessing){
00209    int npsu=0; int nmod,nmodHV2,nmodHV3;
00210    int modId1,modId2, dcuId;
00211    int dcs,branch,crate,board;
00212    int rack=0;
00213    std::string channelstr1;
00214    short int channel;
00215    std::string psinfo;
00216  //  ifstream *LVfile;
00217  //  ifstream *HVfile;
00218    
00219   
00220  
00221   std::string LVfilename=tkmapPset.getUntrackedParameter<std::string>("trackerdatPath","")+"psdcumap.dat";
00222   std::string HVfilename=tkmapPset.getUntrackedParameter<std::string>("trackerdatPath","")+"hvmap.dat";
00223   
00224   ifstream LVfile(edm::FileInPath(LVfilename).fullPath().c_str(),std::ios::in);
00225   
00226   std::cout<<LVfilename<<" "<<HVfilename<<std::endl;
00227   
00228   
00229    if(enableHVProcessing){
00230            
00231             ifstream HVfile(edm::FileInPath(HVfilename).fullPath().c_str(),std::ios::in);
00232             while(!HVfile.eof()) {
00233             HVfile >> modId2 >> channelstr1;
00234             std::string channelstr2 = channelstr1.substr(9,1);
00235             channel= atoi(channelstr2.c_str());
00236             TmModule *imod = imoduleMap[modId2];
00237            // if(modId1==modId2){
00238             imod->HVchannel=channel;      
00239            
00240               } 
00241                 
00242             }
00243         
00244   
00245    while(!LVfile.eof()) {
00246       LVfile >> modId1 >> dcuId >>  psinfo;
00247       
00248       int length=psinfo.length();
00249       std::string dcsinfo = psinfo.substr(39,1);
00250       std::string branchinfo = psinfo.substr(57,2);
00251       std::string crateinfo= psinfo.substr(69,1);
00252       std::string boardinfo = psinfo.substr(80,2);
00253       std::string psIdinfo = psinfo.substr(83,length-83);
00254     
00255       dcs= atoi(dcsinfo.c_str());
00256       branch= atoi(branchinfo.c_str());
00257       crate= atoi(crateinfo.c_str())+1;
00258       board= atoi(boardinfo.c_str())+1;
00259    
00260       if(dcs==1)rack=(branch+1)/2;
00261       if(dcs==2)rack=(branch+1)/2 + 7;
00262       if(dcs==3)rack=(branch+1)/2 + 15;
00263       if(dcs==4)rack=(branch+1)/2 + 22;
00264       
00265       int key = rack*1000+crate*100+board;
00266       
00267       TmPsu *psu = psuMap[key];
00268       TmModule *imod = imoduleMap[modId1];
00269       if(psu==0){
00270         psu = new TmPsu(dcs,branch,rack,crate,board);
00271         psuMap[key]=psu;
00272         psu->psId=psIdinfo;
00273       }
00274    
00275       psuModuleMap.insert(std::make_pair(psu,imod));
00276       if(imod!=0)imod->PsuId=psIdinfo;imod->psuIdex=psu->idex;
00277        
00278       }
00279       
00280    
00281  //  int nmax=0; 
00282    std::map<int , TmPsu *>::iterator ipsu;
00283    std::multimap<TmPsu*, TmModule*>::iterator it;
00284    std::pair<std::multimap<TmPsu*, TmModule*>::iterator,std::multimap<TmPsu*, TmModule*>::iterator> ret;
00285    npsu=0;
00286   
00287    for( ipsu=psuMap.begin();ipsu !=psuMap.end(); ipsu++){
00288      TmPsu *  psu= ipsu->second;
00289      npsu++;
00290     
00291     if(psu!=0){
00292         
00293       std::ostringstream outs;
00294       std::ostringstream outs1;
00295         
00296       std::ostringstream outs3;
00297       std::ostringstream outs4;
00298         
00299       std::ostringstream outs5;
00300       std::ostringstream outs6;
00301         
00302         outs <<"PSU "<<psu->psId<<" connected to Mainframe "<<psu->getPsuDcs()<<" BranchController "<<psu->getPsuBranch()<<" (Rack "<<psu->getPsuRack()<<"), crate "<<psu->getPsuCrate()<<" in position "<< psu->getPsuBoard()<< " with modules: ";
00303         outs1<<"(";
00304         
00305         if(enableHVProcessing){
00306           outs3 <<"PSU "<<psu->psId<<" connected to Mainframe "<<psu->getPsuDcs()<<" BranchController "<<psu->getPsuBranch()<<" (Rack "<<psu->getPsuRack()<<"),crate "<<psu->getPsuCrate()<<" in position "<< psu->getPsuBoard()<<" and HV channel 002 with modules: ";
00307           outs4<<"(";
00308         
00309           outs5 <<"PSU "<<psu->psId<<" connected to Mainframe "<<psu->getPsuDcs()<<" BranchController "<<psu->getPsuBranch()<<" (Rack "<<psu->getPsuRack()<<"), crate "<<psu->getPsuCrate()<<" in position "<< psu->getPsuBoard()<<" and HV channel 002 with modules: ";
00310           outs6<<"(";}
00311         
00312         
00313         ret = psuModuleMap.equal_range(psu);
00314         nmod=0;
00315         nmodHV2=0;
00316         nmodHV3=0;
00317         for (it = ret.first; it != ret.second; ++it)
00318           {
00319             nmod++; 
00320             outs << (*it).second->idex << ", ";
00321             outs1 << (*it).second->getKey() <<",";
00322         
00323             if(enableHVProcessing){
00324               if((*it).second->HVchannel==2){
00325               nmodHV2++;
00326               outs3 << (*it).second->idex << ", ";
00327               outs4 << (*it).second->getKey() <<",";}
00328               else if((*it).second->HVchannel==3){
00329               nmodHV3++;
00330               outs5 << (*it).second->idex << ", ";
00331               outs6 << (*it).second->getKey() <<",";}
00332         
00333               }
00334           }
00335 
00336         outs1 << ")";
00337         psu->nmod=nmod;
00338         outs << "(" << psu->nmod << ")";
00339         psu->text=outs.str();
00340         psu->cmodid_LV=outs1.str();
00341         if(enableHVProcessing){
00342         outs4 << ")";
00343         outs6 << ")";
00344         psu->nmodHV2=nmodHV2;
00345         psu->nmodHV3=nmodHV3;
00346         outs3 << "(" << psu->nmodHV2 << ")";
00347         outs5 << "(" << psu->nmodHV3 << ")";
00348         psu->textHV2=outs3.str();
00349         psu->textHV3=outs5.str();
00350         psu->cmodid_HV2=outs4.str();
00351         psu->cmodid_HV3=outs6.str();
00352         }
00353     }
00354    }
00355   
00356   
00357    npsuracks=29;
00358    std::cout << npsu << " psu stored in " <<npsuracks<<" racks"<<std::endl;
00359   }
00360 }
00361 
00362 TrackerMap::TrackerMap(const edm::ParameterSet & tkmapPset) {
00363  psetAvailable=true;
00364   xsize=340;ysize=200;
00365   title=" ";
00366   jsfilename="CommonTools/TrackerMap/data/trackermap.txt";
00367   infilename="CommonTools/TrackerMap/data/tracker.dat";
00368   enableFedProcessing=true;ncrates=0;
00369   saveAsSingleLayer=false;
00370   if(tkmapPset.exists("trackermaptxtPath")){
00371   jsfilename=tkmapPset.getUntrackedParameter<std::string>("trackermaptxtPath","")+"trackermap.txt";
00372   std::cout << jsfilename << std::endl;
00373   infilename=tkmapPset.getUntrackedParameter<std::string>("trackerdatPath","")+"tracker.dat";
00374   std::cout << infilename << std::endl;
00375   } else std::cout << "no parameters found" << std::endl;
00376  init();
00377 }
00378 
00379 TrackerMap::TrackerMap(std::string s,int xsize1,int ysize1) {
00380  psetAvailable=false;
00381   xsize=xsize1;ysize=ysize1;
00382   title=s;
00383   jsfilename="CommonTools/TrackerMap/data/trackermap.txt";
00384   infilename="CommonTools/TrackerMap/data/tracker.dat";
00385   enableFedProcessing=false; 
00386   saveAsSingleLayer=false;
00387  init();
00388 }
00389 
00390 void TrackerMap::reset() {
00391 std::map<int , TmModule *>::iterator i_mod;
00392     for( i_mod=imoduleMap.begin();i_mod !=imoduleMap.end(); i_mod++){
00393       TmModule *  mod= i_mod->second;
00394       mod->count=0;mod->value=0;mod->red=-1;
00395       }
00396 }
00397 
00398 void TrackerMap::init() {
00399   
00400   int ntotmod=0;
00401   ix=0;iy=0; //used to compute the place of each layer in the tracker map
00402   firstcall = true;
00403   minvalue=0.; maxvalue=minvalue;
00404   posrel=true;
00405   palette = 1;
00406   printflag=true;
00407   addPixelFlag=false;
00408   temporary_file=false;
00409   gminvalue=0.; gmaxvalue=0.;//default global range for online rendering
00410 
00411   ndet = 3; // number of detectors: pixel, inner silicon, outer silicon
00412   npart = 3; // number of detector parts: endcap -z, barrel, endcap +z
00413 
00414   //allocate module map
00415   for (int subdet=1; subdet < ndet+1; subdet++){//loop on subdetectors
00416     for (int detpart=1; detpart < npart+1; detpart++){//loop on subdetectors parts
00417       int nlayers = getlayerCount(subdet,detpart); // compute number of layers
00418       for(int layer=1; layer < nlayers+1; layer++){//loop on layers
00419         int nrings = getringCount(subdet,detpart,layer);// compute number of rings
00420         //fill arrays used to do the loop on the rings  
00421         int layer_g = nlayer(subdet,detpart,layer);
00422         ntotRing[layer_g-1]=nrings;
00423         firstRing[layer_g-1]=1;
00424         if(subdet==3 && detpart!=2)  firstRing[layer_g-1]= 8-nrings; //special numbering for TEC 
00425         for (int ring=firstRing[layer_g-1]; ring < ntotRing[layer_g-1]+firstRing[layer_g-1];ring++){//loop on rings
00426           int nmodules = getmoduleCount(subdet,detpart,layer,ring);// compute number of modules
00427           int key=0;
00428           TmModule *smodule; 
00429           for(int module=1; module < nmodules+1; module++){//loop on modules
00430             smodule = new TmModule(module,ring,layer_g);
00431             key=layer_g*100000+ring*1000+module;//key identifying module
00432             smoduleMap[key]=smodule;
00433             ntotmod++;
00434           }
00435           if(isRingStereo(key))for(int module=1; module < nmodules+1; module++){//loop on stereo modules
00436             smodule = new TmModule(module+100,ring,layer_g);
00437             int key=layer_g*100000+ring*1000+module+100;
00438             smoduleMap[key]=smodule;
00439             ntotmod++;
00440           }
00441         }
00442       }
00443     }
00444   }
00445  build();
00446 }
00447 
00448 TrackerMap::~TrackerMap() {
00449  
00450 for (int layer=1; layer < 44; layer++){
00451     for (int ring=firstRing[layer-1]; ring < ntotRing[layer-1]+firstRing[layer-1];ring++){
00452       for (int module=1;module<200;module++) {
00453         int key=layer*100000+ring*1000+module;
00454         TmModule * mod = smoduleMap[key];
00455         if(mod !=0 ) delete mod;
00456       }
00457     }
00458   }
00459 
00460 //std::map<int , TmModule *>::iterator i_mod;
00461 //   for( i_mod=imoduleMap.begin();i_mod !=imoduleMap.end(); i_mod++){
00462 //      TmModule *  mod= i_mod->second;
00463 //      delete mod;
00464 //      }
00465 std::map<int , TmApvPair *>::iterator i_apv;
00466   for( i_apv=apvMap.begin();i_apv !=apvMap.end(); i_apv++){
00467       TmApvPair *  apvPair= i_apv->second;
00468       delete apvPair;
00469       }
00470 
00471 
00472 std::map<int , TmCcu *>::iterator i_ccu;
00473    for( i_ccu=ccuMap.begin();i_ccu !=ccuMap.end(); i_ccu++){
00474      TmCcu *  ccu= i_ccu->second;
00475      delete ccu;
00476      }
00477 
00478 std::map<int , TmPsu *>::iterator ipsu;
00479     for( ipsu=psuMap.begin();ipsu !=psuMap.end(); ipsu++){
00480      TmPsu *  psu= ipsu->second;
00481      delete psu;
00482      }
00483 
00484 gROOT->Reset();
00485 
00486 
00487 //for(std::vector<TColor*>::iterator col1=vc.begin();col1!=vc.end();col1++){
00488 //     std::cout<<(*col1)<<std::endl;}
00489 }
00490 
00491 
00492 
00493 
00494 
00495 void TrackerMap::drawModule(TmModule * mod, int key,int nlay, bool print_total, std::ofstream * svgfile){
00496   //int x,y;
00497   double phi,r,dx,dy, dy1;
00498   double xp[4],yp[4],xp1,yp1;
00499   double vhbot,vhtop,vhapo;
00500   double rmedio[]={0.041,0.0701,0.0988,0.255,0.340,0.430,0.520,0.610,0.696,0.782,0.868,0.965,1.080};
00501   double xt1,yt1,xs1=0.,ys1=0.,xt2,yt2,xs2,ys2,pv1,pv2;
00502   int green = 0;
00503   int red = 0;
00504   int blue = 0;
00505   double xd[4],yd[4];
00506   int np = 4;
00507   //int numrec=0;
00508   int numod=0;
00509   phi = phival(mod->posx,mod->posy);
00510   r = sqrt(mod->posx*mod->posx+mod->posy*mod->posy);
00511   vhbot = mod->width;
00512   vhtop=mod->width;
00513   vhapo=mod->length;
00514   if(nlay < 31){ //endcap
00515     vhbot = mod->widthAtHalfLength/2.-(mod->width/2.-mod->widthAtHalfLength/2.);
00516     vhtop=mod->width/2.;
00517     vhapo=mod->length/2.;
00518     if(nlay >12 && nlay <19){
00519       if(posrel)r = r+r;
00520       xp[0]=r-vhtop;yp[0]=-vhapo;
00521       xp[1]=r+vhtop;yp[1]=-vhapo;
00522       xp[2]=r+vhtop;yp[2]=vhapo;
00523       xp[3]=r-vhtop;yp[3]=vhapo;
00524     }else{
00525       if(posrel)r = r + r/3.;
00526       xp[0]=r-vhapo;yp[0]=-vhbot;
00527       xp[1]=r+vhapo;yp[1]=-vhtop;
00528       xp[2]=r+vhapo;yp[2]=vhtop;
00529       xp[3]=r-vhapo;yp[3]=vhbot;
00530     }
00531     for(int j=0;j<4;j++){
00532       xp1 = xp[j]*cos(phi)-yp[j]*sin(phi);
00533       yp1 = xp[j]*sin(phi)+yp[j]*cos(phi);
00534       xp[j] = xp1;yp[j]=yp1;
00535     }
00536   } else { //barrel
00537     numod=mod->idModule;if(numod>100)numod=numod-100;
00538     int vane = mod->ring;
00539     if(posrel){
00540       dx = vhapo;
00541       phi=M_PI;
00542       xt1=rmedio[nlay-31]; yt1=-vhtop/2.;
00543       xs1 = xt1*cos(phi)-yt1*sin(phi);
00544       ys1 = xt1*sin(phi)+yt1*cos(phi);
00545       xt2=rmedio[nlay-31]; yt2=vhtop/2.;
00546       xs2 = xt2*cos(phi)-yt2*sin(phi);
00547       ys2 = xt2*sin(phi)+yt2*cos(phi);
00548       dy=phival(xs2,ys2)-phival(xs1,ys1);
00549          dy1 = dy;
00550       if(nlay==31)dy1=0.39;
00551       if(nlay==32)dy1=0.23;
00552       if(nlay==33)dy1=0.16;
00553       xp[0]=vane*(dx+dx/8.);yp[0]=numod*(dy1);
00554       xp[1]=vane*(dx+dx/8.)+dx;yp[1]=numod*(dy1);
00555       xp[2]=vane*(dx+dx/8.)+dx;yp[2]=numod*(dy1)+dy;
00556       xp[3]=vane*(dx+dx/8.);yp[3]=numod*(dy1)+dy;
00557     }else{
00558       xt1=r; yt1=-vhtop/2.;
00559       xs1 = xt1*cos(phi)-yt1*sin(phi);
00560       ys1 = xt1*sin(phi)+yt1*cos(phi);
00561       xt2=r; yt2=vhtop/2.;
00562       xs2 = xt2*cos(phi)-yt2*sin(phi);
00563       ys2 = xt2*sin(phi)+yt2*cos(phi);
00564       pv1=phival(xs1,ys1);
00565       pv2=phival(xs2,ys2);
00566       if(fabs(pv1-pv2)>M_PI && numod==1)pv1=pv1-2.*M_PI;
00567       if(fabs(pv1-pv2)>M_PI && numod!=1)pv2=pv2+2.*M_PI;
00568       xp[0]=mod->posz-vhapo/2.;yp[0]=4.2*pv1;
00569       xp[1]=mod->posz+vhapo/2.;yp[1]=4.2*pv1;
00570       xp[2]=mod->posz+vhapo/2. ;yp[2]=4.2*pv2;
00571           xp[3]=mod->posz-vhapo/2.;yp[3]=4.2*pv2;
00572     }
00573   }
00574   if(isRingStereo(key))
00575         {
00576           np = 3;
00577           if(mod->idModule>100 ){for(int j=0;j<3;j++){
00578               xd[j]=xdpixel(xp[j]);yd[j]=ydpixel(yp[j]);
00579             }
00580           }else {
00581             xd[0]=xdpixel(xp[2]);yd[0]=ydpixel(yp[2]);
00582             xd[1]=xdpixel(xp[3]);yd[1]=ydpixel(yp[3]);
00583             xd[2]=xdpixel(xp[0]);yd[2]=ydpixel(yp[0]);
00584           }
00585         } else {
00586     for(int j=0;j<4;j++){
00587       xd[j]=xdpixel(xp[j]);yd[j]=ydpixel(yp[j]);
00588     }
00589   }
00590   char buffer [20];
00591    sprintf(buffer,"%X",mod->idex);
00592 
00593  if(mod->red < 0){ //use count to compute color
00594  int color = getcolor(mod->value,palette);
00595      red=(color>>16)&0xFF;
00596      green=(color>>8)&0xFF;
00597      blue=(color)&0xFF;
00598   
00599 if(!print_total)mod->value=mod->value*mod->count;//restore mod->value
00600   
00601   if(mod->count > 0)
00602     if(temporary_file) *svgfile << red << " " << green << " " << blue << " "; else
00603     *svgfile <<"<svg:polygon detid=\""<<mod->idex<<"\" count=\""<<mod->count <<"\" value=\""<<mod->value<<"\" id=\""<<key<<"\" capvids=\""<<mod->capvids<<"\" lv=\""<<mod->psuIdex<<"\" hv=\""<<mod->psuIdex*10 + mod->HVchannel<<"\" fec=\""<<mod->CcuId<<"\" onclick=\"showData(evt);\" onmouseover=\"showData(evt);\" onmouseout=\"showData(evt);\" MESSAGE=\""<<mod->text<<"\" POS=\""<<mod->name<<" \" fill=\"rgb("<<red<<","<<green<<","<<blue<<")\" points=\"";
00604   else
00605     if(temporary_file) *svgfile << 255 << " " << 255 << " " << 255 << " "; else
00606     *svgfile <<"<svg:polygon detid=\""<<mod->idex<<"\" count=\""<<mod->count <<"\" value=\""<<mod->value<<"\" id=\""<<key<<"\" capvids=\""<<mod->capvids<<"\" lv=\""<<mod->psuIdex<<"\" hv=\""<<mod->psuIdex*10 + mod->HVchannel<<"\" fec=\""<<mod->CcuId<<"\" onclick=\"showData(evt);\" onmouseover=\"showData(evt);\" onmouseout=\"showData(evt);\" MESSAGE=\""<<mod->text<<"\" POS=\""<<mod->name<<" \" fill=\"white\" points=\"";
00607   if(temporary_file) *svgfile << np << " ";
00608   for(int k=0;k<np;k++){
00609     if(temporary_file)*svgfile << xd[k] << " " << yd[k] << " " ; else
00610     *svgfile << xd[k] << "," << yd[k] << " " ;
00611   }
00612   if(temporary_file)*svgfile << std::endl; else *svgfile <<"\" />" <<std::endl;
00613  } else {//color defined with fillc
00614   if(mod->red>255)mod->red=255;
00615   if(mod->green>255)mod->green=255;
00616   if(mod->blue>255)mod->blue=255;
00617     if(temporary_file) *svgfile << mod->red << " " << mod->green << " " << mod->blue << " "; else
00618     *svgfile <<"<svg:polygon detid=\""<<mod->idex<<"\" count=\""<<mod->count <<"\" value=\""<<mod->value<<"\" id=\""<<key<<"\" capvids=\""<<mod->capvids<<"\" lv=\""<<mod->psuIdex<<"\" hv=\""<<mod->psuIdex*10 + mod->HVchannel<<"\" fec=\""<<mod->CcuId<<"\" onclick=\"showData(evt);\" onmouseover=\"showData(evt);\" onmouseout=\"showData(evt);\" MESSAGE=\""<<mod->text<<"\" POS=\""<<mod->name<<" \" fill=\"rgb("<<mod->red<<","<<mod->green<<","<<mod->blue<<")\" points=\"";
00619   if(temporary_file) *svgfile << np << " ";
00620   for(int k=0;k<np;k++){
00621     if(temporary_file)*svgfile << xd[k] << " " << yd[k] << " " ; else
00622     *svgfile << xd[k] << "," << yd[k] << " " ;
00623   }
00624   if(temporary_file)*svgfile << std::endl; else *svgfile <<"\" />" <<std::endl;
00625  }
00626   
00627 }
00628 
00629 //export  tracker map
00630 //print_total = true represent in color the total stored in the module
00631 //print_total = false represent in color the average  
00632 void TrackerMap::save(bool print_total,float minval, float maxval,std::string s,int width, int height){
00633   
00634   std::string filetype=s,outputfilename=s;
00635   std::vector<TPolyLine*> vp;
00636   TGaxis *axis = 0 ;
00637   size_t found=filetype.find_last_of(".");
00638   filetype=filetype.substr(found+1);
00639   found=outputfilename.find_last_of(".");
00640   outputfilename=outputfilename.substr(0,found);
00641  //outputfilename.erase(outputfilename.begin()+outputfilename.find("."),outputfilename.end());
00642   temporary_file=true;
00643   if(filetype=="svg")temporary_file=false;
00644   std::ostringstream outs;
00645   minvalue=minval; maxvalue=maxval;
00646   outs << outputfilename << ".coor";
00647   savefile = new std::ofstream(outs.str().c_str(),std::ios::out);
00648  if(!print_total){
00649   for (int layer=1; layer < 44; layer++){
00650     for (int ring=firstRing[layer-1]; ring < ntotRing[layer-1]+firstRing[layer-1];ring++){
00651       for (int module=1;module<200;module++) {
00652         int key=layer*100000+ring*1000+module;
00653         TmModule * mod = smoduleMap[key];
00654         if(mod !=0 && !mod->notInUse()){
00655           mod->value = mod->value / mod->count;
00656         }
00657       }
00658     }
00659   }
00660   }
00661   
00662   if(minvalue>=maxvalue){
00663   minvalue=9999999.;
00664   maxvalue=-9999999.;
00665   for (int layer=1; layer < 44; layer++){
00666     for (int ring=firstRing[layer-1]; ring < ntotRing[layer-1]+firstRing[layer-1];ring++){
00667       for (int module=1;module<200;module++) {
00668         int key=layer*100000+ring*1000+module;
00669         TmModule * mod = smoduleMap[key];
00670         if(mod !=0 && !mod->notInUse()){
00671           if (minvalue > mod->value)minvalue=mod->value;
00672           if (maxvalue < mod->value)maxvalue=mod->value;
00673         }
00674       }
00675     }
00676   }
00677 }
00678   if (maxvalue == minvalue) printflag = false;
00679   if(!temporary_file){
00680   *savefile << "<?xml version=\"1.0\"  standalone=\"no\" ?>"<<std::endl;
00681   *savefile << "<svg  xmlns=\"https://www.w3.org/2000/svg\""<<std::endl;
00682   *savefile << "xmlns:svg=\"https://www.w3.org/2000/svg\" "<<std::endl;
00683   *savefile << "xmlns:xlink=\"https://www.w3.org/1999/xlink\">"<<std::endl;
00684   *savefile << "<svg:svg id=\"mainMap\" x=\"0\" y=\"0\" viewBox=\"0 0 3100 1600"<<"\" width=\""<<width<<"\" height=\""<<height<<"\">"<<std::endl;
00685   *savefile << "<svg:rect fill=\"lightblue\" stroke=\"none\" x=\"0\" y=\"0\" width=\"3100\" height=\"1600\" /> "<<std::endl; 
00686   *savefile << "<svg:g id=\"tracker\" transform=\"translate(10,1500) rotate(270)\" style=\"fill:none;stroke:black;stroke-width:0;\"> "<<std::endl;
00687    }
00688   for (int layer=1; layer < 44; layer++){
00689     nlay=layer;
00690     defwindow(nlay);
00691     for (int ring=firstRing[layer-1]; ring < ntotRing[layer-1]+firstRing[layer-1];ring++){
00692       for (int module=1;module<200;module++) {
00693         int key=layer*100000+ring*1000+module;
00694         TmModule * mod = smoduleMap[key];
00695         if(mod !=0 && !mod->notInUse()){
00696           drawModule(mod,key,layer,print_total,savefile);
00697         }
00698       }
00699     }
00700   }
00701   
00702   if(!temporary_file){
00703     *savefile << "</svg:g>"<<std::endl;
00704     *savefile << " <svg:text id=\"Title\" class=\"normalText\"  x=\"300\" y=\"0\">"<<title<<"</svg:text>"<<std::endl;
00705   }
00706   
00707   if(printflag)drawPalette(savefile);
00708   if(!temporary_file){
00709     *savefile << "</svg:svg>"<<std::endl;
00710     *savefile << "</svg>"<<std::endl;
00711   }
00712   savefile->close(); delete savefile;
00713 
00714   const char * command1;
00715   std::string tempfilename = outputfilename + ".coor";
00716   if(filetype=="svg"){
00717     std::string command = "mv "+tempfilename +" " +outputfilename + ".svg";
00718     command1=command.c_str();
00719     std::cout << "Executing " << command1 << std::endl;
00720     system(command1);
00721   }
00722   
00723   if (temporary_file){ // create root trackermap image
00724     int red,green,blue,npoints,colindex,ncolor;
00725     double x[4],y[4];
00726     ifstream tempfile(tempfilename.c_str(),std::ios::in);
00727     TCanvas *MyC = new TCanvas("MyC", "TrackerMap",width,height);
00728     gPad->SetFillColor(38);
00729     
00730     if(addPixelFlag)gPad->Range(0,0,3800,1600);else gPad->Range(800,0,3800,1600);
00731     
00732     //First  build palette
00733     ncolor=0;
00734     typedef std::map<int,int> ColorList;
00735     ColorList colorList;
00736     ColorList::iterator pos;
00737     TColor *col, *c;
00738     std::cout<<"tempfilename "<<tempfilename<<std::endl;
00739     while(!tempfile.eof()) {
00740       tempfile  >> red >> green  >> blue >> npoints; 
00741       colindex=red+green*1000+blue*1000000;
00742       pos=colorList.find(colindex); 
00743       if(pos == colorList.end()){ colorList[colindex]=ncolor+100; col =gROOT->GetColor(ncolor+100);
00744       if(col) col->SetRGB((Double_t)(red/255.),(Double_t)(green/255.),(Double_t)(blue/255.)); else c = new TColor(ncolor+100,(Double_t)(red/255.),(Double_t)(green/255.),(Double_t)(blue/255.));vc.push_back(c); ncolor++;}
00745       for (int i=0;i<npoints;i++){
00746         tempfile >> x[i] >> y[i];  
00747       }
00748     }
00749    
00750     if(ncolor>0 && ncolor<10000){
00751       Int_t colors[10000];
00752       for(int i=0;i<ncolor;i++){colors[i]=i+100;}
00753       gStyle->SetPalette(ncolor,colors);
00754     }
00755     
00756     tempfile.clear();
00757     tempfile.seekg(0,std::ios::beg);
00758     std::cout << "created palette with " << ncolor << " colors" << std::endl;
00759   
00760     while(!tempfile.eof()) {//create polylines
00761       tempfile  >> red >> green  >> blue >> npoints; 
00762       for (int i=0;i<npoints;i++){
00763         tempfile >> x[i] >> y[i];  
00764       }
00765       colindex=red+green*1000+blue*1000000;
00766       pos=colorList.find(colindex); 
00767       if(pos != colorList.end()){
00768         TPolyLine*  pline = new TPolyLine(npoints,y,x);
00769         vp.push_back(pline);
00770         pline->SetFillColor(colorList[colindex]);
00771         pline->SetLineWidth(0);
00772         pline->Draw("f");
00773       }
00774     }
00775     if (printflag) {
00776       axis = new TGaxis(3660,36,3660,1530,minvalue,maxvalue,510,"+L");
00777       axis->SetLabelSize(0.02);
00778       axis->Draw();
00779     }
00780     TLatex l;
00781     l.SetTextSize(0.03);
00782     l.DrawLatex(950,1330,"TID");
00783     l.DrawLatex(2300,1330,"TEC");
00784     l.DrawLatex(300,1330,"FPIX");
00785     l.DrawLatex(20,560,"BPIX L1");
00786     l.DrawLatex(500,385,"BPIX L2");
00787     l.DrawLatex(500,945,"BPIX L3");
00788     l.SetTextSize(0.04);
00789     l.DrawLatex(850,1500,title.c_str());
00790     l.DrawLatex(1730,40,"-z");
00791     l.DrawLatex(1730,1360,"+z");
00792     l.DrawLatex(1085,330,"TIB L1");
00793     l.DrawLatex(1085,1000,"TIB L2");
00794     l.DrawLatex(1585,330,"TIB L3");
00795     l.DrawLatex(1585,1000,"TIB L4");
00796     l.DrawLatex(2085,330,"TOB L1");
00797     l.DrawLatex(2085,1000,"TOB L2");
00798     l.DrawLatex(2585,330,"TOB L3");
00799     l.DrawLatex(2585,1000,"TOB L4");
00800     l.DrawLatex(3085,330,"TOB L5");
00801     l.DrawLatex(3085,1000,"TOB L6");
00802     TArrow arx(3448,1190,3448,1350,0.01,"|>");
00803     l.DrawLatex(3460,1350,"x");
00804     TArrow ary(3448,1190,3312,1190,0.01,"|>");
00805     l.DrawLatex(3312,1210,"y");
00806     TArrow arz(3485,373,3485,676,0.01,"|>");
00807     l.DrawLatex(3510,667,"z");
00808     TArrow arphi(3485,511,3037,511,0.01,"|>");
00809     l.DrawLatex(3023,520,"#Phi");
00810     arx.SetLineWidth(3);
00811     ary.SetLineWidth(3);
00812     arz.SetLineWidth(3);
00813     arphi.SetLineWidth(3);
00814     arx.Draw();
00815     ary.Draw();
00816     arz.Draw();
00817     arphi.Draw();
00818     MyC->Update();
00819     if(filetype=="png"){
00820       
00821       std::string filename = outputfilename + ".png";
00822       std::cout << "printing " <<filename<< std::endl;
00823       MyC->Print(filename.c_str());
00824     }
00825     if(filetype=="jpg"){
00826       std::string filename = outputfilename + ".jpg";
00827       MyC->Print(filename.c_str());
00828     }
00829     if(filetype=="pdf"){
00830       std::string filename = outputfilename + ".pdf";
00831       MyC->Print(filename.c_str());
00832     }
00833     std::string command = "rm "+tempfilename ;
00834     command1=command.c_str();
00835     std::cout << "Executing " << command1 << std::endl;
00836     system(command1);
00837     MyC->Clear();
00838     delete MyC;
00839     if (printflag)delete axis;
00840     for(std::vector<TPolyLine*>::iterator pos1=vp.begin();pos1!=vp.end();pos1++){
00841          delete (*pos1);}
00842     
00843   }
00844 
00845   
00846 }
00847 void TrackerMap::drawApvPair(int crate, int numfed_incrate, bool print_total, TmApvPair* apvPair,std::ofstream * svgfile,bool useApvPairValue)
00848 {
00849   double xp[4],yp[4];
00850   int color;
00851   int green = 0;
00852   int red = 0;
00853   int blue = 0;
00854   double xd[4],yd[4];
00855   int np = 4;
00856   double boxinitx=0., boxinity=0.; 
00857   double dx=.9,dy=.9;
00858   int numfedch_incolumn = 12;
00859   int numfedch_inrow = 8;
00860   int numfed_incolumn = 5;
00861   int numfed_inrow = 4;
00862   boxinitx=boxinitx+(numfed_incolumn-(numfed_incrate-1)/numfed_inrow)*14.;
00863   boxinity=boxinity+(numfed_inrow-(numfed_incrate-1)%numfed_inrow)*9.;
00864   boxinity=boxinity+numfedch_inrow-(apvPair->getFedCh()/numfedch_incolumn);
00865   boxinitx = boxinitx+numfedch_incolumn-(int)(apvPair->getFedCh()%numfedch_incolumn);
00866   //std::cout << crate << " " << numfed_incrate << " " << apvPair->getFedCh()<<" "<<boxinitx<< " " << boxinity << std::endl; ;
00867   xp[0]=boxinitx;yp[0]=boxinity;
00868   xp[1]=boxinitx+dx;yp[1]=boxinity;
00869   xp[2]=boxinitx+dx;yp[2]=boxinity + dy;
00870   xp[3]=boxinitx;yp[3]=boxinity + dy;
00871   for(int j=0;j<4;j++){
00872     xd[j]=xdpixelc(xp[j]);yd[j]=ydpixelc(yp[j]);
00873     //std::cout << boxinity << " "<< ymax << " "<< yp[j] << std::endl;
00874   }
00875   
00876   char buffer [20];
00877   sprintf(buffer,"%X",apvPair->mod->idex);
00878   std::string s = apvPair->mod->name;
00879   s.erase(s.begin()+s.find("connected"),s.end());
00880 
00881   if(useApvPairValue){ 
00882     if(apvPair->red < 0){ //use count to compute color
00883       if(apvPair->count > 0) {
00884         color = getcolor(apvPair->value,palette);
00885         red=(color>>16)&0xFF;
00886         green=(color>>8)&0xFF;
00887         blue=(color)&0xFF;
00888         if(!print_total)apvPair->value=apvPair->value*apvPair->count;//restore mod->value
00889         if(temporary_file)*svgfile << red << " " << green << " " << blue << " ";
00890            else *svgfile <<"<svg:polygon detid=\""<<apvPair->idex<<"\" count=\""<<apvPair->count <<"\" value=\""<<apvPair->value<<"\" id=\""<<apvPair->idex+crate*1000000<<"\" cmodid=\""<<apvPair->mod->getKey()<<"\" onclick=\"showData(evt);\" onmouseover=\"showData(evt);\" onmouseout=\"showData(evt);\" MESSAGE=\"""\" POS=\"Fed/Ch "<<apvPair->getFedId()<<"/"<<apvPair->getFedCh()<<" connected to "<<s<<" Id "<<buffer<<" \" fill=\"rgb("<<red<<","<<green<<","<<blue<<")\" points=\"";
00891       } else {
00892         if(temporary_file)*svgfile << 255 << " " << 255 << " " << 255 << " ";
00893          else *svgfile <<"<svg:polygon detid=\""<<apvPair->idex<<"\" count=\""<<apvPair->count <<"\" value=\""<<apvPair->value<<"\" id=\""<<apvPair->idex+crate*1000000<<"\"  cmodid=\""<<apvPair->mod->getKey()<<"\" onclick=\"showData(evt);\" onmouseover=\"showData(evt);\" onmouseout=\"showData(evt);\" MESSAGE=\"""\" POS=\"Fed/Ch "<<apvPair->getFedId()<<"/"<<apvPair->getFedCh()<<" connected to "<<s<<" Id "<<buffer<<" \" fill=\"white\" points=\"";
00894       }
00895     } else {//color defined with fillc
00896       if(apvPair->red>255)apvPair->red=255;
00897       if(apvPair->green>255)apvPair->green=255;
00898       if(apvPair->blue>255)apvPair->blue=255;
00899       if(temporary_file)*svgfile << apvPair->red << " " << apvPair->green << " " << apvPair->blue << " ";
00900          else *svgfile <<"<svg:polygon detid=\""<<apvPair->idex<<"\" count=\""<<apvPair->count <<"\" value=\""<<apvPair->value<<"\" id=\""<<apvPair->idex+crate*1000000<<"\" cmodid=\""<<apvPair->mod->getKey()<<"\" onclick=\"showData(evt);\" onmouseover=\"showData(evt);\" onmouseout=\"showData(evt);\" MESSAGE=\"""\" POS=\"Fed/Ch "<<apvPair->getFedId()<<"/"<<apvPair->getFedCh()<<" connected to "<<s<<" Id "<<buffer<<" \" fill=\"rgb("<<apvPair->red<<","<<apvPair->green<<","<<apvPair->blue<<")\" points=\"";
00901     }
00902   }else{
00903     if(apvPair->mod->red < 0){ //use count to compute color
00904       if(apvPair->mod->count > 0) {
00905         color = getcolor(apvPair->mod->value,palette);
00906         red=(color>>16)&0xFF;
00907         green=(color>>8)&0xFF;
00908         blue=(color)&0xFF;
00909         if(temporary_file)*svgfile << red << " " << green << " " << blue << " ";
00910            else *svgfile <<"<svg:polygon detid=\""<<apvPair->idex<<"\" count=\""<<apvPair->count <<"\" value=\""<<apvPair->value<<"\" id=\""<<apvPair->idex+crate*1000000<<"\" cmodid=\""<<apvPair->mod->getKey()<<"\" onclick=\"showData(evt);\" onmouseover=\"showData(evt);\" onmouseout=\"showData(evt);\" MESSAGE=\"""\" POS=\"Fed/Ch "<<apvPair->getFedId()<<"/"<<apvPair->getFedCh()<<" connected to "<<s<<" Id "<<buffer<<" \" fill=\"rgb("<<red<<","<<green<<","<<blue<<")\" points=\"";
00911       } else {
00912         if(temporary_file)*svgfile << 255 << " " << 255 << " " << 255 << " ";
00913          else *svgfile <<"<svg:polygon detid=\""<<apvPair->idex<<"\" count=\""<<apvPair->count <<"\" value=\""<<apvPair->value<<"\" id=\""<<apvPair->idex+crate*1000000<<"\"  cmodid=\""<<apvPair->mod->getKey()<<"\" onclick=\"showData(evt);\" onmouseover=\"showData(evt);\" onmouseout=\"showData(evt);\" MESSAGE=\"""\" POS=\"Fed/Ch "<<apvPair->getFedId()<<"/"<<apvPair->getFedCh()<<" connected to "<<s<<" Id "<<buffer<<" \" fill=\"white\" points=\"";
00914       }
00915     } else {//color defined with fillc
00916       if(apvPair->mod->red>255)apvPair->mod->red=255;
00917       if(apvPair->mod->green>255)apvPair->mod->green=255;
00918       if(apvPair->mod->blue>255)apvPair->mod->blue=255;
00919       if(temporary_file)*svgfile << apvPair->mod->red << " " << apvPair->mod->green << " " << apvPair->mod->blue << " ";
00920          else *svgfile <<"<svg:polygon detid=\""<<apvPair->idex<<"\" count=\""<<apvPair->count <<"\" value=\""<<apvPair->value<<"\" id=\""<<apvPair->idex+crate*1000000<<"\" cmodid=\""<<apvPair->mod->getKey()<<"\" onclick=\"showData(evt);\" onmouseover=\"showData(evt);\" onmouseout=\"showData(evt);\" MESSAGE=\"""\" POS=\"Fed/Ch "<<apvPair->getFedId()<<"/"<<apvPair->getFedCh()<<" connected to "<<s<<" Id "<<buffer<<" \" fill=\"rgb("<<apvPair->mod->red<<","<<apvPair->mod->green<<","<<apvPair->mod->blue<<")\" points=\"";
00921     }
00922   }
00923   if(temporary_file)*svgfile << np << " ";
00924   for(int k=0;k<np;k++){
00925     if(temporary_file)*svgfile << xd[k] << " " << yd[k] << " " ; 
00926       else *svgfile << xd[k] << "," << yd[k] << " " ;
00927   }
00928   if(temporary_file)*svgfile << std::endl;
00929      else *svgfile <<"\" />" <<std::endl;
00930 }
00931 void TrackerMap::drawCcu(int crate, int numfec_incrate, bool print_total, TmCcu* ccu,std::ofstream * svgfile,bool useCcuValue)
00932 {
00933   double xp[4],yp[4];
00934   int color;
00935   int green = 0;
00936   int red = 0;
00937   int blue = 0;
00938   double xd[4],yd[4];
00939   int np = 4;
00940   double boxinitx=0., boxinity=0.;
00941   double dx=.9,dy=.9;
00942   int numccu_incolumn = 8;
00943   int numccu_inrow = 15;
00944   int numfed_incolumn = 5;
00945   int numfed_inrow = 4;
00946   boxinitx=boxinitx+(numfed_incolumn-(numfec_incrate-1)/numfed_inrow)*14.;
00947   boxinity=boxinity+(numfed_inrow-(numfec_incrate-1)%numfed_inrow)*16.;
00948   boxinity=boxinity+numccu_inrow-ccu->mpos;
00949   boxinitx = boxinitx+numccu_incolumn-(int)(ccu->getCcuRing()%numccu_incolumn);
00950   //std::cout << crate << " " << numfec_incrate << " " << ccu->getCcuRing()<<" "<<ccu->mpos<<" "<<boxinitx<< " " << boxinity << std::endl; ;
00951   xp[0]=boxinitx;yp[0]=boxinity;
00952   xp[1]=boxinitx+dx;yp[1]=boxinity;
00953   xp[2]=boxinitx+dx;yp[2]=boxinity + dy;
00954   xp[3]=boxinitx;yp[3]=boxinity + dy;
00955   for(int j=0;j<4;j++){
00956     xd[j]=xdpixelfec(xp[j]);yd[j]=ydpixelfec(yp[j]);
00957     //std::cout << boxinity << " "<< ymax << " "<< yp[j] << std::endl;
00958   }
00959 
00960   char buffer [20];
00961   sprintf(buffer,"%X",ccu->idex);
00962   //sprintf(buffer,"%X",ccu->mod->idex);
00963   //std::string s = ccu->mod->name;
00964   std::string s = ccu->text;
00965   s.erase(s.begin()+s.find("connected"),s.end());
00966 
00967   if(ccu->red < 0){ //use count to compute color
00968     if(ccu->count > 0) {
00969       color = getcolor(ccu->value,palette);
00970       red=(color>>16)&0xFF;
00971       green=(color>>8)&0xFF;
00972       blue=(color)&0xFF;
00973       if(!print_total)ccu->value=ccu->value*ccu->count;//restore mod->value
00974       if(temporary_file)*svgfile << red << " " << green << " " << blue << " ";
00975       else *svgfile <<"<svg:polygon detid=\""<<ccu->idex<<"\" count=\""<<ccu->count <<"\" value=\""<<ccu->value<<"\" id=\""<<ccu->idex+crate*1000000<<"\" cmodid=\""<<ccu->cmodid<<"\" layer=\""<<ccu->layer<<"\" onclick=\"showData(evt);\" onmouseover=\"showData(evt);\" onmouseout=\"showData(evt);\" MESSAGE=\"""\" POS=\"Slot/Ring"<<ccu->getCcuSlot()<<"/"<<ccu->getCcuRing()<<" connected to "<<s<<" Id "<<buffer<<" \" fill=\"rgb("<<red<<","<<green<<","<<blue<<")\" points=\"";
00976     } else {
00977       if(temporary_file)*svgfile << 255 << " " << 255 << " " << 255 << " ";
00978       else *svgfile <<"<svg:polygon detid=\""<<ccu->idex<<"\" count=\""<<ccu->count <<"\" value=\""<<ccu->value<<"\" id=\""<<ccu->idex+crate*1000000<<"\"  cmodid=\""<<ccu->cmodid<<"\" layer=\""<<ccu->layer<<"\" onclick=\"showData(evt);\" onmouseover=\"showData(evt);\" onmouseout=\"showData(evt);\" MESSAGE=\"""\" POS=\"Slot/Ring "<<ccu->getCcuSlot()<<"/"<<ccu->getCcuRing()<<" connected to "<<s<<" Id "<<buffer<<" \" fill=\"white\" points=\"";
00979     }
00980   } else {//color defined with fillc
00981     if(ccu->red>255)ccu->red=255;
00982     if(ccu->green>255)ccu->green=255;
00983     if(ccu->blue>255)ccu->blue=255;
00984     if(temporary_file)*svgfile << ccu->red << " " << ccu->green << " " << ccu->blue << " ";
00985     else *svgfile <<"<svg:polygon detid=\""<<ccu->idex<<"\" count=\""<<ccu->count <<"\" value=\""<<ccu->value<<"\" id=\""<<ccu->idex+crate*1000000<<"\" cmodid=\""<<ccu->cmodid<<"\" layer=\""<<ccu->layer<<"\" onclick=\"showData(evt);\" onmouseover=\"showData(evt);\" onmouseout=\"showData(evt);\" MESSAGE=\"""\" POS=\"Slot/Ring "<<ccu->getCcuSlot()<<"/"<<ccu->getCcuRing()<<" connected to "<<s<<" Id "<<buffer<<" \" fill=\"rgb("<<ccu->red<<","<<ccu->green<<","<<ccu->blue<<")\" points=\"";
00986   }
00987 if(temporary_file)*svgfile << np << " ";
00988 for(int k=0;k<np;k++){
00989   if(temporary_file)*svgfile << xd[k] << " " << yd[k] << " " ;
00990   else *svgfile << xd[k] << "," << yd[k] << " " ;
00991 }
00992 if(temporary_file)*svgfile << std::endl;
00993 else *svgfile <<"\" />" <<std::endl;
00994 
00995 }
00996 void TrackerMap::drawPsu(int rack,int numcrate_inrack , bool print_total, TmPsu* psu,std::ofstream * svgfile,bool usePsuValue)
00997 {
00998   double xp[4],yp[4];
00999   int color;
01000   int green = 0;
01001   int red = 0;
01002   int blue = 0;
01003   double xd[4],yd[4];
01004   int np = 4;
01005   double boxinitx=35, boxinity=12; 
01006   double dx=3,dy=1.3;
01007   
01008   boxinitx= boxinitx+(5 - numcrate_inrack)*5;
01009   boxinity= boxinity+(18 - psu->getPsuBoard())*1.75;
01010 
01011   xp[0]=boxinitx;yp[0]=boxinity;
01012   xp[1]=boxinitx+dx;yp[1]=boxinity;
01013   xp[2]=boxinitx+dx;yp[2]=boxinity + dy;
01014   xp[3]=boxinitx;yp[3]=boxinity + dy;
01015  
01016  
01017   for(int j=0;j<4;j++){
01018     xd[j]=xdpixelpsu(xp[j]);yd[j]=ydpixelpsu(yp[j]);
01019     //std::cout << boxinity << " "<< ymax << " "<< yp[j] << std::endl;
01020   }
01021   
01022   char buffer [20];
01023   sprintf(buffer,"%X",psu->idex);
01024   std::string s = psu->text;
01025   s.erase(s.begin()+s.find("connected"),s.end());
01026    
01027   if(psu->red < 0){ //use count to compute color
01028     if(psu->value > 0){
01029       color = getcolor(psu->value,palette);
01030       red=(color>>16)&0xFF;
01031       green=(color>>8)&0xFF;
01032       blue=(color)&0xFF;
01033       if(!print_total)psu->value=psu->value*psu->count;//restore mod->value
01034       if(temporary_file)*svgfile << red << " " << green << " " << blue << " ";
01035       else *svgfile <<"<svg:polygon detid=\""<<psu->idex<<"\" count=\""<<psu->count <<"\" value=\""<<psu->value<<"\" id=\""<< psu->idex <<"\" cmodid=\""<<psu->cmodid_LV<<"\" onclick=\"showData(evt);\" onmouseover=\"showData(evt);\" onmouseout=\"showData(evt);\" MESSAGE=\"""\" POS=\"easyCrate/easyBoard "<<psu->getPsuCrate()<<"/"<<psu->getPsuBoard()<<" connected to "<<s<<" \" fill=\"rgb("<<red<<","<<green<<","<<blue<<")\" points=\"";
01036       } 
01037       else{
01038      
01039       if(temporary_file)*svgfile << 255 << " " << 255 << " " << 255 << " ";
01040       else *svgfile <<"<svg:polygon detid=\""<<psu->idex<<"\" count=\""<<psu->count <<"\" value=\""<<psu->value<<"\" id=\""<< psu->idex <<"\"  cmodid=\""<<psu->cmodid_LV<<"\" onclick=\"showData(evt);\" onmouseover=\"showData(evt);\" onmouseout=\"showData(evt);\" MESSAGE=\"""\" POS=\"easyCrate/easyBoard "<<psu->getPsuCrate()<<"/"<<psu->getPsuBoard()<<" connected to "<<s<<" \" fill=\"white\" points=\"";
01041       }
01042     } 
01043    
01044     else {//color defined with fillc
01045     if(psu->red>255)psu->red=255;
01046     if(psu->green>255)psu->green=255;
01047     if(psu->blue>255)psu->blue=255;
01048     if(temporary_file)*svgfile << psu->red << " " << psu->green << " " << psu->blue << " ";
01049     else *svgfile <<"<svg:polygon detid=\""<<psu->idex<<"\" count=\""<<psu->count <<"\" value=\""<<psu->value<<"\" id=\""<< psu->idex <<"\" cmodid=\""<<psu->cmodid_LV<<"\" onclick=\"showData(evt);\" onmouseover=\"showData(evt);\" onmouseout=\"showData(evt);\" MESSAGE=\"""\" POS=\"easyCrate/easyBoard "<<psu->getPsuCrate()<<"/"<<psu->getPsuBoard()<<" connected to "<<s<<" \" fill=\"rgb("<<psu->red<<","<<psu->green<<","<<psu->blue<<")\" points=\"";
01050   }
01051 
01052 if(temporary_file)*svgfile << np << " ";
01053 for(int k=0;k<np;k++){
01054   if(temporary_file)*svgfile << xd[k] << " " << yd[k] << " " ; 
01055   else *svgfile << xd[k] << "," << yd[k] << " " ;
01056 }
01057 if(temporary_file)*svgfile << std::endl;
01058 else *svgfile <<"\" />" <<std::endl;
01059 
01060 }
01061 
01062 void TrackerMap::drawHV2(int rack,int numcrate_inrack , bool print_total, TmPsu* psu,std::ofstream * svgfile,bool usePsuValue)
01063 {
01064   double xp[4],yp[4];
01065   int color;
01066   int greenHV2 = 0;
01067   int redHV2 = 0;
01068   int blueHV2 = 0;
01069   double xd[4],yd[4];
01070   int np = 4;
01071   double boxinitx=35, boxinity=12; 
01072   double dx=1.1,dy=1.3;
01073   
01074   boxinitx= boxinitx+(5 - numcrate_inrack)*5;
01075   boxinity= boxinity+(18 - psu->getPsuBoard())*1.75;
01076 
01077   xp[0]=boxinitx;yp[0]=boxinity;
01078   xp[1]=boxinitx+dx;yp[1]=boxinity;
01079   xp[2]=boxinitx+dx;yp[2]=boxinity + dy;
01080   xp[3]=boxinitx;yp[3]=boxinity + dy;
01081  
01082  
01083   for(int j=0;j<4;j++){
01084     xd[j]=xdpixelpsu(xp[j]);yd[j]=ydpixelpsu(yp[j]);
01085     //std::cout << boxinity << " "<< ymax << " "<< yp[j] << std::endl;
01086   }
01087   
01088   char buffer [20];
01089   sprintf(buffer,"%X",psu->idex);
01090   std::string s = psu->textHV2;
01091   s.erase(s.begin()+s.find("connected"),s.end());
01092    
01093   if(psu->redHV2 < 0){ //use count to compute color
01094     
01095     if(psu->valueHV2 > 0){
01096       color = getcolor(psu->valueHV2,palette);
01097       redHV2=(color>>16)&0xFF;
01098       greenHV2=(color>>8)&0xFF;
01099       blueHV2=(color)&0xFF;
01100       if(!print_total)psu->valueHV2=psu->valueHV2*psu->countHV2;//restore mod->value
01101       if(temporary_file)*svgfile << redHV2 << " " << greenHV2 << " " << blueHV2 << " ";
01102       else *svgfile <<"<svg:polygon detid=\""<<psu->idex<<"\" count=\""<<psu->countHV2 <<"\" value=\""<<psu->valueHV2<<"\" id=\""<< psu->idex*10+2 <<"\" cmodid=\""<<psu->cmodid_HV2<<"\" onclick=\"showData(evt);\" onmouseover=\"showData(evt);\" onmouseout=\"showData(evt);\" MESSAGE=\"""\" POS=\"easyCrate/easyBoard "<<psu->getPsuCrate()<<"/"<<psu->getPsuBoard()<<" connected to "<<s<<" \" fill=\"rgb("<<redHV2<<","<<greenHV2<<","<<blueHV2<<")\" points=\"";
01103       } 
01104       else{
01105       if(temporary_file)*svgfile << 255 << " " << 255 << " " << 255 << " ";
01106       else *svgfile <<"<svg:polygon detid=\""<<psu->idex<<"\" count=\""<<psu->countHV2 <<"\" value=\""<<psu->valueHV2<<"\" id=\""<< psu->idex*10+2 <<"\"  cmodid=\""<<psu->cmodid_HV2<<"\" onclick=\"showData(evt);\" onmouseover=\"showData(evt);\" onmouseout=\"showData(evt);\" MESSAGE=\"""\" POS=\"easyCrate/easyBoard "<<psu->getPsuCrate()<<"/"<<psu->getPsuBoard()<<" connected to "<<s<<" \" fill=\"white\" points=\"";
01107       }
01108     } 
01109    
01110     else {//color defined with fillc
01111     if(psu->redHV2>255)psu->redHV2=255;
01112     if(psu->greenHV2>255)psu->greenHV2=255;
01113     if(psu->blueHV2>255)psu->blueHV2=255;
01114     if(temporary_file)*svgfile << psu->redHV2 << " " << psu->greenHV2 << " " << psu->blueHV2 << " ";
01115     else *svgfile <<"<svg:polygon detid=\""<<psu->idex<<"\" count=\""<<psu->countHV2 <<"\" value=\""<<psu->valueHV2<<"\" id=\""<< psu->idex*10+2 <<"\" cmodid=\""<<psu->cmodid_HV2<<"\" onclick=\"showData(evt);\" onmouseover=\"showData(evt);\" onmouseout=\"showData(evt);\" MESSAGE=\"""\" POS=\"easyCrate/easyBoard "<<psu->getPsuCrate()<<"/"<<psu->getPsuBoard()<<" connected to "<<s<<" \" fill=\"rgb("<<psu->redHV2<<","<<psu->greenHV2<<","<<psu->blueHV2<<")\" points=\"";
01116   }
01117 
01118 if(temporary_file)*svgfile << np << " ";
01119 for(int k=0;k<np;k++){
01120   if(temporary_file)*svgfile << xd[k] << " " << yd[k] << " " ; 
01121   else *svgfile << xd[k] << "," << yd[k] << " " ;
01122 }
01123 if(temporary_file)*svgfile << std::endl;
01124 else *svgfile <<"\" />" <<std::endl;
01125 
01126 }
01127 
01128 
01129 void TrackerMap::drawHV3(int rack,int numcrate_inrack , bool print_total, TmPsu* psu,std::ofstream * svgfile,bool usePsuValue)
01130 {
01131   double xp[4],yp[4];
01132   int color;
01133   int greenHV3 = 0;
01134   int redHV3 = 0;
01135   int blueHV3 = 0;
01136   double xd[4],yd[4];
01137   int np = 4;
01138   double boxinitx=36.5, boxinity=12; 
01139   double dx=1.1,dy=1.3;
01140   
01141   boxinitx= boxinitx+(5 - numcrate_inrack)*5;
01142   boxinity= boxinity+(18 - psu->getPsuBoard())*1.75;
01143 
01144   xp[0]=boxinitx;yp[0]=boxinity;
01145   xp[1]=boxinitx+dx;yp[1]=boxinity;
01146   xp[2]=boxinitx+dx;yp[2]=boxinity + dy;
01147   xp[3]=boxinitx;yp[3]=boxinity + dy;
01148  
01149  
01150   for(int j=0;j<4;j++){
01151     xd[j]=xdpixelpsu(xp[j]);yd[j]=ydpixelpsu(yp[j]);
01152     //std::cout << boxinity << " "<< ymax << " "<< yp[j] << std::endl;
01153   }
01154   
01155   char buffer [20];
01156   sprintf(buffer,"%X",psu->idex);
01157   std::string s = psu->textHV3;
01158   s.erase(s.begin()+s.find("connected"),s.end());
01159    
01160   if(psu->redHV3 < 0){ //use count to compute color
01161     if(psu->valueHV3 > 0){
01162       color = getcolor(psu->valueHV3,palette);
01163       redHV3=(color>>16)&0xFF;
01164       greenHV3=(color>>8)&0xFF;
01165       blueHV3=(color)&0xFF;
01166       if(!print_total)psu->valueHV3=psu->valueHV3*psu->countHV3;//restore mod->value
01167       if(temporary_file)*svgfile << redHV3 << " " << greenHV3 << " " << blueHV3 << " ";
01168       else *svgfile <<"<svg:polygon detid=\""<<psu->idex<<"\" count=\""<<psu->countHV3 <<"\" value=\""<<psu->valueHV3<<"\" id=\""<< psu->idex*10+3 <<"\" cmodid=\""<<psu->cmodid_HV3<<"\" onclick=\"showData(evt);\" onmouseover=\"showData(evt);\" onmouseout=\"showData(evt);\" MESSAGE=\"""\" POS=\"easyCrate/easyBoard"<<psu->getPsuCrate()<<"/"<<psu->getPsuBoard()<<" connected to "<<s<<" \" fill=\"rgb("<<redHV3<<","<<greenHV3<<","<<blueHV3<<")\" points=\"";
01169       } 
01170       else{
01171       if(temporary_file)*svgfile << 255 << " " << 255 << " " << 255 << " ";
01172       else *svgfile <<"<svg:polygon detid=\""<<psu->idex<<"\" count=\""<<psu->countHV3 <<"\" value=\""<<psu->valueHV3<<"\" id=\""<< psu->idex*10+3 <<"\"  cmodid=\""<<psu->cmodid_HV3<<"\" onclick=\"showData(evt);\" onmouseover=\"showData(evt);\" onmouseout=\"showData(evt);\" MESSAGE=\"""\" POS=\"easyCrate/easyBoard "<<psu->getPsuCrate()<<"/"<<psu->getPsuBoard()<<" connected to "<<s<<" \" fill=\"white\" points=\"";
01173       }
01174     } 
01175    
01176     else {//color defined with fillc
01177     if(psu->redHV3>255)psu->redHV3=255;
01178     if(psu->greenHV3>255)psu->greenHV3=255;
01179     if(psu->blueHV3>255)psu->blueHV3=255;
01180     if(temporary_file)*svgfile << psu->redHV3 << " " << psu->greenHV3 << " " << psu->blueHV3 << " ";
01181     else *svgfile <<"<svg:polygon detid=\""<<psu->idex<<"\" count=\""<<psu->countHV3 <<"\" value=\""<<psu->valueHV3<<"\" id=\""<< psu->idex*10+3 <<"\" cmodid=\""<<psu->cmodid_HV3<<"\" onclick=\"showData(evt);\" onmouseover=\"showData(evt);\" onmouseout=\"showData(evt);\" MESSAGE=\"""\" POS=\"easyCrate/easyBoard "<<psu->getPsuCrate()<<"/"<<psu->getPsuBoard()<<" connected to "<<s<<" \" fill=\"rgb("<<psu->redHV3<<","<<psu->greenHV3<<","<<psu->blueHV3<<")\" points=\"";
01182   }
01183 
01184 if(temporary_file)*svgfile << np << " ";
01185 for(int k=0;k<np;k++){
01186   if(temporary_file)*svgfile << xd[k] << " " << yd[k] << " " ; 
01187   else *svgfile << xd[k] << "," << yd[k] << " " ;
01188 }
01189 if(temporary_file)*svgfile << std::endl;
01190 else *svgfile <<"\" />" <<std::endl;
01191 
01192 }
01193 
01194 void TrackerMap::save_as_fectrackermap(bool print_total,float minval, float maxval,std::string s,int width, int height){
01195  if(enableFecProcessing){
01196   std::string filetype=s,outputfilename=s;
01197   std::vector<TPolyLine*> vp;
01198   size_t found=filetype.find_last_of(".");
01199   filetype=filetype.substr(found+1);
01200   found=outputfilename.find_last_of(".");
01201   outputfilename=outputfilename.substr(0,found); 
01202   temporary_file=true;
01203   if(filetype=="xml"||filetype=="svg")temporary_file=false;
01204   std::ostringstream outs;
01205   minvalue=minval; maxvalue=maxval;
01206   outs << outputfilename << ".coor";
01207   if(temporary_file)savefile = new std::ofstream(outs.str().c_str(),std::ios::out);
01208    std::map<int , TmCcu *>::iterator i_ccu;
01209    std::multimap<TmCcu*, TmModule*>::iterator it;
01210    std::pair<std::multimap<TmCcu*, TmModule*>::iterator,std::multimap<TmCcu*, TmModule*>::iterator> ret;
01211   //Decide if we must use Module or Ccu value
01212   bool useCcuValue=false;
01213   
01214   
01215   for( i_ccu=ccuMap.begin();i_ccu !=ccuMap.end(); i_ccu++){
01216     TmCcu *  ccu= i_ccu->second;
01217     if(ccu!=0) {
01218         if(ccu->count > 0 || ccu->red!=-1) { useCcuValue=true; break;}
01219       }
01220     }
01221  
01222   
01223   if(!useCcuValue)//store mean of connected modules value{
01224     for(  i_ccu=ccuMap.begin();i_ccu !=ccuMap.end(); i_ccu++){
01225     TmCcu *  ccu= i_ccu->second;
01226       if(ccu!=0) {
01227             ret = fecModuleMap.equal_range(ccu);
01228         for (it = ret.first; it != ret.second; ++it)
01229           {
01230            if( (*it).second->count>0){ccu->value=ccu->value+(*it).second->value;ccu->count++;}
01231           }
01232           if(ccu->count>0)ccu->value=ccu->value/ccu->count;
01233           if(ccu->nmod==0)  { ccu->red=0;ccu->green=0;ccu->blue=0;}
01234           }
01235           }
01236   
01237  
01238   if(title==" Tracker Map from  QTestAlarm"){
01239       for(  i_ccu=ccuMap.begin();i_ccu !=ccuMap.end(); i_ccu++){
01240           TmCcu *  ccu= i_ccu->second;
01241           if(ccu!=0) {
01242             ret = fecModuleMap.equal_range(ccu);
01243             ccu->red=0;ccu->green=255;ccu->blue=0;
01244             for (it = ret.first; it != ret.second; ++it) {
01245               if( !( (*it).second->red==0 && (*it).second->green==255 && (*it).second->blue==0 ) && !( (*it).second->red==255 && (*it).second->green==255 && (*it).second->blue==255 ) ){
01246                 ccu->red=255;ccu->green=0;ccu->blue=0;
01247                 }
01248               }
01249            }
01250       }
01251    }
01252   
01253 
01254   
01255   if(!print_total){
01256     for(  i_ccu=ccuMap.begin();i_ccu !=ccuMap.end(); i_ccu++){
01257     TmCcu *  ccu= i_ccu->second;
01258       if(ccu!=0) {
01259           if(useCcuValue) ccu->value = ccu->value / ccu->count;
01260 
01261         }
01262     }
01263   }
01264  
01265   if(minvalue>=maxvalue){
01266 
01267     minvalue=9999999.;
01268     maxvalue=-9999999.;
01269     for( i_ccu=ccuMap.begin();i_ccu !=ccuMap.end(); i_ccu++){
01270        TmCcu *  ccu= i_ccu->second;
01271        if(ccu!=0) {
01272               if (minvalue > ccu->value)minvalue=ccu->value;
01273               if (maxvalue < ccu->value)maxvalue=ccu->value;
01274         }
01275     }
01276   }
01277 
01278 
01279   
01280  if(filetype=="svg"){
01281       saveAsSingleLayer=false;
01282       std::ostringstream outs;
01283     outs << outputfilename<<".svg";
01284     savefile = new std::ofstream(outs.str().c_str(),std::ios::out);
01285   *savefile << "<?xml version=\"1.0\"  standalone=\"no\" ?>"<<std::endl;
01286   *savefile << "<svg  xmlns=\"https://www.w3.org/2000/svg\""<<std::endl;
01287   *savefile << "xmlns:svg=\"https://www.w3.org/2000/svg\" "<<std::endl;
01288   *savefile << "xmlns:xlink=\"https://www.w3.org/1999/xlink\">"<<std::endl;
01289   *savefile << "<svg:svg id=\"mainMap\" x=\"0\" y=\"0\" viewBox=\"0 0 3000 1600"<<"\" width=\""<<width<<"\" height=\""<<height<<"\">"<<std::endl;
01290   *savefile << "<svg:rect fill=\"lightblue\" stroke=\"none\" x=\"0\" y=\"0\" width=\"3000\" height=\"1600\" /> "<<std::endl;
01291   *savefile << "<svg:g id=\"fedtrackermap\" transform=\"translate(10,1500) rotate(270)\" style=\"fill:none;stroke:black;stroke-width:0;\"> "<<std::endl;
01292      }
01293   for (int crate=1; crate < (nfeccrates+1); crate++){
01294     if(filetype=="xml"){
01295       saveAsSingleLayer=true;
01296       std::ostringstream outs;
01297     outs << outputfilename<<"feccrate" <<crate<< ".xml";
01298     savefile = new std::ofstream(outs.str().c_str(),std::ios::out);
01299     *savefile << "<?xml version=\"1.0\" standalone=\"no\"?>"<<std::endl;
01300     *savefile << "<svg xmlns=\"https://www.w3.org/2000/svg\""<<std::endl;
01301     *savefile << "xmlns:svg=\"https://www.w3.org/2000/svg\""<<std::endl;
01302     *savefile << "xmlns:xlink=\"https://www.w3.org/1999/xlink\" >"<<std::endl;
01303     *savefile << "<script type=\"text/ecmascript\" xlink:href=\"feccrate.js\" />"<<std::endl;
01304     *savefile << "<svg id=\"mainMap\" x=\"0\" y=\"0\" viewBox=\"0 0  500 500\" width=\"700\" height=\"700\" onload=\"TrackerCrate.init()\">"<<std::endl;
01305     *savefile << "<rect fill=\"lightblue\" stroke=\"none\" x=\"0\" y=\"0\" width=\"700\" height=\"700\" />"<<std::endl;
01306     *savefile << "<g id=\"crate\" transform=\" translate(280,580) rotate(270) scale(.7,.8)\"  > "<<std::endl;
01307          }
01308     ncrate=crate;
01309     deffecwindow(ncrate);
01310  
01311     for ( i_ccu=ccuMap.begin();i_ccu !=ccuMap.end(); i_ccu++){
01312       TmCcu *  ccu= i_ccu->second;
01313       if(ccu!=0){
01314         if(ccu->getCcuCrate() == crate){
01315               
01316               drawCcu(crate,ccu->getCcuSlot()-2,print_total,ccu,savefile,useCcuValue);
01317         }
01318       }
01319     }
01320  
01321    if(!temporary_file){
01322     if(filetype=="xml"){
01323     *savefile << "</g> </svg> <text id=\"currentElementText\" x=\"40\" y=\"30\"> " << std::endl;
01324     *savefile << "<tspan id=\"line1\" x=\"40\" y=\"30\"> </tspan> " << std::endl;
01325     *savefile << "<tspan id=\"line2\" x=\"40\" y=\"60\"> </tspan> " << std::endl;
01326     *savefile << " </text> </svg>" << std::endl;
01327     savefile->close();
01328      saveAsSingleLayer=false;
01329       }
01330       }
01331     }
01332     if(filetype=="svg"){
01333     *savefile << "</g> </svg> </svg> " << std::endl;
01334     savefile->close();
01335       }
01336   if(!print_total && !useCcuValue){
01337 //Restore ccu value
01338     for( i_ccu=ccuMap.begin();i_ccu !=ccuMap.end(); i_ccu++){
01339        TmCcu *  ccu= i_ccu->second;
01340        if(ccu!=0) {
01341           ccu->value = ccu->value * ccu->count;
01342     }
01343 }
01344 }
01345  if(temporary_file){
01346    // if(printflag)drawPalette(savefile);
01347   savefile->close();
01348 
01349   const char * command1;
01350   std::string tempfilename = outputfilename + ".coor";
01351     int red,green,blue,npoints,colindex,ncolor;
01352     double x[4],y[4];
01353     ifstream tempfile(tempfilename.c_str(),std::ios::in);
01354     TCanvas *MyC = new TCanvas("MyC", "TrackerMap",width,height);
01355     gPad->SetFillColor(38);
01356 
01357     gPad->Range(0,0,3700,1600);
01358 
01359     //First  build palette
01360     ncolor=0;
01361     typedef std::map<int,int> ColorList;
01362     ColorList colorList;
01363     ColorList::iterator pos;
01364     TColor *col,*c;
01365     while(!tempfile.eof()) {
01366       tempfile  >> red >> green  >> blue >> npoints;
01367       colindex=red+green*1000+blue*1000000;
01368       pos=colorList.find(colindex);
01369       if(pos == colorList.end()){
01370         colorList[colindex]=ncolor+100;
01371         col =gROOT->GetColor(ncolor+100);
01372         if(col)
01373           col->SetRGB((Double_t)(red/255.),(Double_t)(green/255.),(Double_t)(blue/255.));
01374         else
01375           c = new TColor(ncolor+100,(Double_t)(red/255.),(Double_t)(green/255.),(Double_t)(blue/255.));
01376           vc.push_back(c);
01377         ncolor++;
01378       }
01379       for (int i=0;i<npoints;i++){
01380         tempfile >> x[i] >> y[i];
01381       }
01382     }
01383     if(ncolor>0 && ncolor<10000){
01384       Int_t colors[10000];
01385       for(int i=0;i<ncolor;i++){colors[i]=i+100;}
01386       gStyle->SetPalette(ncolor,colors);
01387     }
01388     tempfile.clear();
01389     tempfile.seekg(0,std::ios::beg);
01390     std::cout << "created palette with " << ncolor << " colors" << std::endl;
01391     while(!tempfile.eof()) {//create polylines
01392       tempfile  >> red >> green  >> blue >> npoints;
01393       for (int i=0;i<npoints;i++){
01394         tempfile >> x[i] >> y[i];
01395       }
01396       colindex=red+green*1000+blue*1000000;
01397       pos=colorList.find(colindex);
01398       if(pos != colorList.end()){
01399         TPolyLine*  pline = new TPolyLine(npoints,y,x);
01400         vp.push_back(pline);
01401         pline->SetFillColor(colorList[colindex]);
01402         pline->SetLineWidth(0);
01403         pline->Draw("f");
01404       }
01405     }
01406     MyC->Update();
01407     std::cout << "Filetype " << filetype << std::endl;
01408     if(filetype=="png"){
01409       std::string filename = outputfilename + ".png";
01410       MyC->Print(filename.c_str());
01411     }
01412     if(filetype=="jpg"){
01413       std::string filename = outputfilename + ".jpg";
01414       MyC->Print(filename.c_str());
01415     }
01416     if(filetype=="pdf"){
01417       std::string filename = outputfilename + ".pdf";
01418       MyC->Print(filename.c_str());
01419     }
01420     std::string command = "rm "+tempfilename ;
01421     command1=command.c_str();
01422     std::cout << "Executing " << command1 << std::endl;
01423     system(command1);
01424     MyC->Clear();
01425     delete MyC;
01426     for(std::vector<TPolyLine*>::iterator pos1=vp.begin();pos1!=vp.end();pos1++){
01427          delete (*pos1);}
01428    
01429 
01430 
01431 
01432 }//if(temporary_file)
01433 }//if(enabledFecProcessing)
01434 }
01435 void TrackerMap::save_as_HVtrackermap(bool print_total,float minval, float maxval,std::string s,int width, int height){
01436   
01437  if(enableHVProcessing){
01438   std::string filetype=s,outputfilename=s;
01439   std::vector<TPolyLine*> vp;
01440   
01441   size_t found=filetype.find_last_of(".");
01442   filetype=filetype.substr(found+1);
01443   found=outputfilename.find_last_of(".");
01444   outputfilename=outputfilename.substr(0,found);
01445 
01446   temporary_file=true;
01447   
01448 
01449   if(filetype=="xml"||filetype=="svg")temporary_file=false;
01450   
01451   std::ostringstream outs;
01452   minvalue=minval; maxvalue=maxval;
01453   outs << outputfilename << ".coor";
01454   if(temporary_file)savefile = new std::ofstream(outs.str().c_str(),std::ios::out);
01455   
01456   std::map<int , TmPsu *>::iterator ipsu;
01457   std::multimap<TmPsu*, TmModule*>::iterator it;
01458   std::pair<std::multimap<TmPsu*, TmModule*>::iterator,std::multimap<TmPsu*, TmModule*>::iterator> ret;
01459  
01460   
01461   bool usePsuValue=false;
01462   
01463   for( ipsu=psuMap.begin();ipsu!=psuMap.end(); ipsu++){
01464     TmPsu*  psu= ipsu->second;
01465     if(psu!=0) {
01466       if(psu->countHV2 > 0 || psu->redHV2!=-1 || psu->countHV3 > 0 || psu->redHV3!=-1) { usePsuValue=true; break;}
01467       }
01468     }
01469    
01470   if(!usePsuValue){//store mean of connected modules value{
01471     
01472     for(  ipsu=psuMap.begin();ipsu !=psuMap.end(); ipsu++){
01473        TmPsu *  psu= ipsu->second;
01474        if(psu!=0) {
01475        ret = psuModuleMap.equal_range(psu);
01476          for(it = ret.first; it != ret.second; ++it){
01477            if((*it).second->HVchannel==2){ psu->valueHV2=psu->valueHV2+(*it).second->value;}
01478            if((*it).second->HVchannel==3){ psu->valueHV3=psu->valueHV3+(*it).second->value;} 
01479             }
01480          if(psu->nmodHV2!=0){psu->valueHV2=psu->valueHV2/psu->nmodHV2;}
01481          if(psu->nmodHV3!=0){psu->valueHV3=psu->valueHV3/psu->nmodHV3;}
01482          psu->countHV2=1;
01483          psu->countHV3=1; 
01484           
01485            }
01486          
01487          }
01488        }
01489    
01490    if(title==" Tracker Map from  QTestAlarm"){
01491       for(  ipsu=psuMap.begin();ipsu !=psuMap.end(); ipsu++){
01492           TmPsu *  psu= ipsu->second;
01493           if(psu!=0) {
01494             ret = psuModuleMap.equal_range(psu);
01495             psu->redHV2=0;psu->greenHV2=255;psu->blueHV2=0;
01496             psu->redHV3=0;psu->greenHV3=255;psu->blueHV3=0;
01497             for (it = ret.first; it != ret.second; ++it) {
01498               if((*it).second->HVchannel==2){
01499                 if( !( (*it).second->red==0 && (*it).second->green==255 && (*it).second->blue==0 ) && !( (*it).second->red==255 && (*it).second->green==255 && (*it).second->blue==255 ) ){
01500                    psu->redHV2=255;psu->greenHV2=0;psu->blueHV2=0;
01501                    }
01502                 }
01503               if((*it).second->HVchannel==3){
01504                 if( !( (*it).second->red==0 && (*it).second->green==255 && (*it).second->blue==0 ) && !( (*it).second->red==255 && (*it).second->green==255 && (*it).second->blue==255 ) ){
01505                    psu->redHV3=255;psu->greenHV3=0;psu->blueHV3=0;
01506                    }
01507                 }
01508              }
01509            }
01510       }
01511    } 
01512  
01513   if(!print_total){
01514     for(  ipsu=psuMap.begin();ipsu !=psuMap.end(); ipsu++){
01515     TmPsu *  psu= ipsu->second;
01516       if(psu!=0) {
01517           if(usePsuValue){ 
01518             psu->valueHV2 = psu->valueHV2 / psu->countHV2;
01519             psu->valueHV3 = psu->valueHV3 / psu->countHV3;
01520         }
01521     }
01522   }
01523  } 
01524   
01525   if(minvalue>=maxvalue){
01526     
01527     minvalue=9999999.;
01528     maxvalue=-9999999.;
01529     
01530     for( ipsu=psuMap.begin();ipsu !=psuMap.end(); ipsu++){
01531        TmPsu *  psu= ipsu->second;
01532        if(psu!=0) {
01533               if (minvalue > psu->valueHV2 || minvalue > psu->valueHV3)minvalue=std::min(psu->valueHV2,psu->valueHV3);
01534               if (maxvalue < psu->valueHV2 || maxvalue < psu->valueHV3)maxvalue=std::max(psu->valueHV2,psu->valueHV3);
01535               
01536         
01537         }
01538     }
01539   }
01540   
01541      if(filetype=="svg"){
01542       saveAsSingleLayer=false;
01543       std::ostringstream outs;
01544     outs << outputfilename<<".svg";
01545     savefile = new std::ofstream(outs.str().c_str(),std::ios::out);
01546   *savefile << "<?xml version=\"1.0\"  standalone=\"no\" ?>"<<std::endl;
01547   *savefile << "<svg  xmlns=\"https://www.w3.org/2000/svg\""<<std::endl;
01548   *savefile << "xmlns:svg=\"https://www.w3.org/2000/svg\" "<<std::endl;
01549   *savefile << "xmlns:xlink=\"https://www.w3.org/1999/xlink\">"<<std::endl;
01550   *savefile << "<svg:svg id=\"mainMap\" x=\"0\" y=\"0\" viewBox=\"0 0 3000 1600"<<"\" width=\""<<width<<"\" height=\""<<height<<"\">"<<std::endl;
01551   *savefile << "<svg:rect fill=\"lightblue\" stroke=\"none\" x=\"0\" y=\"0\" width=\"3000\" height=\"1600\" /> "<<std::endl; 
01552   *savefile << "<svg:g id=\"HVtrackermap\" transform=\"translate(10,1500) rotate(270)\" style=\"fill:none;stroke:black;stroke-width:0;\"> "<<std::endl;
01553      }
01554    
01555   for (int irack=1; irack < (npsuracks+1); irack++){
01556     if(filetype=="xml"){
01557       saveAsSingleLayer=true;
01558       std::ostringstream outs;
01559     outs << outputfilename<<"HVrack" <<irack<< ".xml";
01560     savefile = new std::ofstream(outs.str().c_str(),std::ios::out);
01561     *savefile << "<?xml version=\"1.0\" standalone=\"no\"?>"<<std::endl;
01562     *savefile << "<svg xmlns=\"https://www.w3.org/2000/svg\""<<std::endl;
01563     *savefile << "xmlns:svg=\"https://www.w3.org/2000/svg\""<<std::endl;
01564     *savefile << "xmlns:xlink=\"https://www.w3.org/1999/xlink\" >"<<std::endl;
01565     *savefile << "<script type=\"text/ecmascript\" xlink:href=\"rackhv.js\" />"<<std::endl;
01566     *savefile << "<svg id=\"mainMap\" x=\"0\" y=\"0\" viewBox=\"0 0  500 500\" width=\"700\" height=\"700\" onload=\"TrackerRackhv.init()\">"<<std::endl;
01567     *savefile << "<rect fill=\"lightblue\" stroke=\"none\" x=\"0\" y=\"0\" width=\"700\" height=\"700\" />"<<std::endl;
01568     *savefile << "<g id=\"rackhv\" transform=\" translate(150,500) rotate(270) scale(1.,1.)\"  > "<<std::endl;
01569          }
01570     
01571     nrack=irack;
01572     defpsuwindow(nrack);
01573     for ( ipsu=psuMap.begin();ipsu !=psuMap.end(); ipsu++){
01574       TmPsu *  psu= ipsu->second;
01575       if(psu->getPsuRack() == irack){
01576               drawHV2(irack,psu->getPsuCrate(),print_total,psu,savefile,usePsuValue);
01577               drawHV3(irack,psu->getPsuCrate(),print_total,psu,savefile,usePsuValue);
01578       }
01579     }
01580    
01581   
01582    if(!temporary_file){
01583     if(filetype=="xml"){
01584     *savefile << "</g> </svg> <text id=\"currentElementText\" x=\"40\" y=\"30\"> " << std::endl;
01585     *savefile << "<tspan id=\"line1\" x=\"40\" y=\"30\"> </tspan> " << std::endl;
01586     *savefile << "<tspan id=\"line2\" x=\"40\" y=\"60\"> </tspan> " << std::endl;
01587     *savefile << " </text> </svg>" << std::endl;
01588     savefile->close();
01589      saveAsSingleLayer=false;
01590       }
01591       }
01592     }
01593     if(filetype=="svg"){
01594     *savefile << "</g> </svg> </svg> " << std::endl;
01595     savefile->close();
01596       }
01597  
01598     //Restore psu value
01599     if(!print_total && !usePsuValue){
01600      for( ipsu=psuMap.begin();ipsu !=psuMap.end(); ipsu++){
01601        TmPsu *psu = ipsu->second;
01602        if(psu!=0) {
01603           psu->valueHV2 = psu->valueHV2 * psu->countHV2;
01604           psu->valueHV3 = psu->valueHV3 * psu->countHV3;
01605           }
01606        }
01607      }
01608   
01609 
01610   if(temporary_file){
01611  //   if(printflag)drawPalette(savefile);
01612     savefile->close(); 
01613 
01614   const char * command1;
01615   std::string tempfilename = outputfilename + ".coor";
01616     int red,green,blue,npoints,colindex,ncolor;
01617     double x[4],y[4];
01618     ifstream tempfile(tempfilename.c_str(),std::ios::in);
01619     TCanvas *MyC = new TCanvas("MyC", "TrackerMap",width,height);
01620     gPad->SetFillColor(38);
01621     
01622     gPad->Range(0,0,3700,1600);
01623     
01624     //First  build palette
01625     ncolor=0;
01626     typedef std::map<int,int> ColorList;
01627     ColorList colorList;
01628     ColorList::iterator pos;
01629     TColor *col,*c;
01630     while(!tempfile.eof()) {
01631       tempfile  >> red >> green  >> blue >> npoints; 
01632       colindex=red+green*1000+blue*1000000;
01633       pos=colorList.find(colindex); 
01634       if(pos == colorList.end()){ 
01635         colorList[colindex]=ncolor+100; 
01636         col =gROOT->GetColor(ncolor+100);
01637         if(col) 
01638           col->SetRGB((Double_t)(red/255.),(Double_t)(green/255.),(Double_t)(blue/255.)); 
01639         else 
01640           c = new TColor(ncolor+100,(Double_t)(red/255.),(Double_t)(green/255.),(Double_t)(blue/255.));
01641           vc.push_back(c);
01642         ncolor++;
01643       }
01644       for (int i=0;i<npoints;i++){
01645         tempfile >> x[i] >> y[i];  
01646       }
01647     }
01648     if(ncolor>0 && ncolor<10000){
01649       Int_t colors[10000];
01650       for(int i=0;i<ncolor;i++){colors[i]=i+100;}
01651       gStyle->SetPalette(ncolor,colors);
01652     }
01653     tempfile.clear();
01654     tempfile.seekg(0,std::ios::beg);
01655     std::cout << "created palette with " << ncolor << " colors" << std::endl;
01656     while(!tempfile.eof()) {//create polylines
01657       tempfile  >> red >> green  >> blue >> npoints; 
01658       for (int i=0;i<npoints;i++){
01659         tempfile >> x[i] >> y[i];  
01660       }
01661       colindex=red+green*1000+blue*1000000;
01662       pos=colorList.find(colindex); 
01663       if(pos != colorList.end()){
01664         TPolyLine*  pline = new TPolyLine(npoints,y,x);
01665         vp.push_back(pline);
01666         pline->SetFillColor(colorList[colindex]);
01667         pline->SetLineWidth(0);
01668         pline->Draw("f");
01669       }
01670     }
01671     MyC->Update();
01672     std::cout << "Filetype " << filetype << std::endl;
01673     if(filetype=="png"){
01674       std::string filename = outputfilename + ".png";
01675       MyC->Print(filename.c_str());
01676     }
01677     if(filetype=="jpg"){
01678       std::string filename = outputfilename + ".jpg";
01679       MyC->Print(filename.c_str());
01680     }
01681     if(filetype=="pdf"){
01682       std::string filename = outputfilename + ".pdf";
01683       MyC->Print(filename.c_str());
01684     }
01685     std::string command = "rm "+tempfilename ;
01686     command1=command.c_str();
01687     std::cout << "Executing " << command1 << std::endl;
01688     system(command1);
01689     MyC->Clear();
01690     delete MyC;
01691     for(std::vector<TPolyLine*>::iterator pos1=vp.begin();pos1!=vp.end();pos1++){
01692          delete (*pos1);}
01693     
01694          
01695          }//if(temporary_file)
01696 }//if(enabledHVProcessing)
01697 }
01698 
01699 
01700 void TrackerMap::save_as_psutrackermap(bool print_total,float minval, float maxval,std::string s,int width, int height){
01701   
01702  if(enableLVProcessing){
01703   
01704   std::string filetype=s,outputfilename=s;
01705   std::vector<TPolyLine*> vp;
01706   
01707   size_t found=filetype.find_last_of(".");
01708   filetype=filetype.substr(found+1);
01709   found=outputfilename.find_last_of(".");
01710   outputfilename=outputfilename.substr(0,found);
01711   
01712   temporary_file=true;
01713   
01714 
01715   
01716   if(filetype=="xml"||filetype=="svg")temporary_file=false;
01717   
01718   std::ostringstream outs;
01719   minvalue=minval; maxvalue=maxval;
01720   outs << outputfilename << ".coor";
01721   if(temporary_file)savefile = new std::ofstream(outs.str().c_str(),std::ios::out);
01722   
01723   std::map<int , TmPsu *>::iterator ipsu;
01724   std::multimap<TmPsu*, TmModule*>::iterator it;
01725   std::pair<std::multimap<TmPsu*, TmModule*>::iterator,std::multimap<TmPsu*, TmModule*>::iterator> ret;
01726  
01727   //Decide if we must use Module or Power Psupply value
01728   bool usePsuValue=false;
01729   
01730   for( ipsu=psuMap.begin();ipsu!=psuMap.end(); ipsu++){
01731     TmPsu*  psu= ipsu->second;
01732     if(psu!=0) {
01733       if(psu->count > 0 || psu->red!=-1) { usePsuValue=true; break;}
01734       }
01735     }
01736   
01737   if(!usePsuValue){//store mean of connected modules value{
01738     for(  ipsu=psuMap.begin();ipsu !=psuMap.end(); ipsu++){
01739        TmPsu *  psu= ipsu->second;
01740        if(psu!=0) {
01741          ret = psuModuleMap.equal_range(psu);
01742          for(it = ret.first; it != ret.second; ++it){
01743             psu->value=psu->value+(*it).second->value;
01744             
01745             }
01746          psu->value=psu->value/psu->nmod;
01747          psu->count=1;
01748      
01749          }
01750        }
01751     }
01752   
01753   if(title==" Tracker Map from  QTestAlarm"){
01754       for(  ipsu=psuMap.begin();ipsu !=psuMap.end(); ipsu++){
01755           TmPsu *  psu= ipsu->second;
01756           if(psu!=0) {
01757             ret = psuModuleMap.equal_range(psu);
01758             psu->red=0;psu->green=255;psu->blue=0;
01759             for (it = ret.first; it != ret.second; ++it) {
01760               if( !( (*it).second->red==0 && (*it).second->green==255 && (*it).second->blue==0 ) && !( (*it).second->red==255 && (*it).second->green==255 && (*it).second->blue==255 ) ){
01761                 psu->red=255;psu->green=0;psu->blue=0;
01762                 }
01763               }
01764            }
01765       }
01766    }
01767   
01768   
01769   
01770   if(!print_total){
01771     for(  ipsu=psuMap.begin();ipsu !=psuMap.end(); ipsu++){
01772     TmPsu *  psu= ipsu->second;
01773       if(psu!=0) {
01774           if(usePsuValue) psu->value = psu->value / psu->count;
01775 
01776         }
01777     }
01778   }
01779   
01780   if(minvalue>=maxvalue){
01781     
01782     minvalue=9999999.;
01783     maxvalue=-9999999.;
01784     for( ipsu=psuMap.begin();ipsu !=psuMap.end(); ipsu++){
01785        TmPsu *  psu= ipsu->second;
01786        if(psu!=0) {
01787               if (minvalue > psu->value)minvalue=psu->value;
01788               if (maxvalue < psu->value)maxvalue=psu->value;
01789         }
01790     }
01791   }
01792   
01793      if(filetype=="svg"){
01794       saveAsSingleLayer=false;
01795       std::ostringstream outs;
01796     outs << outputfilename<<".svg";
01797     savefile = new std::ofstream(outs.str().c_str(),std::ios::out);
01798   *savefile << "<?xml version=\"1.0\"  standalone=\"no\" ?>"<<std::endl;
01799   *savefile << "<svg  xmlns=\"https://www.w3.org/2000/svg\""<<std::endl;
01800   *savefile << "xmlns:svg=\"https://www.w3.org/2000/svg\" "<<std::endl;
01801   *savefile << "xmlns:xlink=\"https://www.w3.org/1999/xlink\">"<<std::endl;
01802   *savefile << "<svg:svg id=\"mainMap\" x=\"0\" y=\"0\" viewBox=\"0 0 3000 1600"<<"\" width=\""<<width<<"\" height=\""<<height<<"\">"<<std::endl;
01803   *savefile << "<svg:rect fill=\"lightblue\" stroke=\"none\" x=\"0\" y=\"0\" width=\"3000\" height=\"1600\" /> "<<std::endl; 
01804   *savefile << "<svg:g id=\"psutrackermap\" transform=\"translate(10,1500) rotate(270)\" style=\"fill:none;stroke:black;stroke-width:0;\"> "<<std::endl;
01805      }
01806   
01807   for (int irack=1; irack < (npsuracks+1); irack++){
01808     if(filetype=="xml"){
01809       saveAsSingleLayer=true;
01810     outs << outputfilename<<"psurack" <<irack<< ".xml";
01811     savefile = new std::ofstream(outs.str().c_str(),std::ios::out);
01812     *savefile << "<?xml version=\"1.0\" standalone=\"no\"?>"<<std::endl;
01813     *savefile << "<svg xmlns=\"https://www.w3.org/2000/svg\""<<std::endl;
01814     *savefile << "xmlns:svg=\"https://www.w3.org/2000/svg\""<<std::endl;
01815     *savefile << "xmlns:xlink=\"https://www.w3.org/1999/xlink\" >"<<std::endl;
01816     *savefile << "<script type=\"text/ecmascript\" xlink:href=\"rack.js\" />"<<std::endl;
01817     *savefile << "<svg id=\"mainMap\" x=\"0\" y=\"0\" viewBox=\"0 0  500 500\" width=\"700\" height=\"700\" onload=\"TrackerCrate.init()\">"<<std::endl;
01818     *savefile << "<rect fill=\"lightblue\" stroke=\"none\" x=\"0\" y=\"0\" width=\"700\" height=\"700\" />"<<std::endl;
01819     *savefile << "<g id=\"rack\" transform=\" translate(150,500) rotate(270) scale(1.,1.)\"  > "<<std::endl;
01820          }
01821    
01822     
01823     nrack=irack;
01824     defpsuwindow(nrack);
01825     for ( ipsu=psuMap.begin();ipsu !=psuMap.end(); ipsu++){
01826       TmPsu *  psu= ipsu->second;
01827       if(psu->getPsuRack() == irack){
01828               
01829               drawPsu(irack,psu->getPsuCrate(),print_total,psu,savefile,usePsuValue);
01830       }
01831     }
01832    
01833     
01834    if(!temporary_file){
01835     if(filetype=="xml"){
01836     *savefile << "</g> </svg> <text id=\"currentElementText\" x=\"40\" y=\"30\"> " << std::endl;
01837     *savefile << "<tspan id=\"line1\" x=\"40\" y=\"30\"> </tspan> " << std::endl;
01838     *savefile << "<tspan id=\"line2\" x=\"40\" y=\"60\"> </tspan> " << std::endl;
01839     *savefile << " </text> </svg>" << std::endl;
01840     savefile->close();
01841      saveAsSingleLayer=false;
01842       }
01843       }
01844     }
01845     if(filetype=="svg"){
01846     *savefile << "</g> </svg> </svg> " << std::endl;
01847     savefile->close();
01848       }
01849  
01850     //Restore psu value
01851     if(!print_total && !usePsuValue){
01852      for( ipsu=psuMap.begin();ipsu !=psuMap.end(); ipsu++){
01853        TmPsu *psu = ipsu->second;
01854        if(psu!=0) {
01855           psu->value = psu->value * psu->count;
01856           }
01857        }
01858      }
01859   
01860   
01861   if(temporary_file){
01862   //  if(printflag)drawPalette(savefile);
01863     savefile->close(); 
01864 
01865   const char * command1;
01866   std::string tempfilename = outputfilename + ".coor";
01867     int red,green,blue,npoints,colindex,ncolor;
01868     double x[4],y[4];
01869     ifstream tempfile(tempfilename.c_str(),std::ios::in);
01870     TCanvas *MyC = new TCanvas("MyC", "TrackerMap",width,height);
01871     gPad->SetFillColor(38);
01872     
01873     gPad->Range(0,0,3700,1600);
01874     
01875     //First  build palette
01876     ncolor=0;
01877     typedef std::map<int,int> ColorList;
01878     ColorList colorList;
01879     ColorList::iterator pos;
01880     TColor *col,*c;
01881     while(!tempfile.eof()) {
01882       tempfile  >> red >> green  >> blue >> npoints; 
01883       colindex=red+green*1000+blue*1000000;
01884       pos=colorList.find(colindex); 
01885       if(pos == colorList.end()){ 
01886         colorList[colindex]=ncolor+100; 
01887         col =gROOT->GetColor(ncolor+100);
01888         if(col) 
01889           col->SetRGB((Double_t)(red/255.),(Double_t)(green/255.),(Double_t)(blue/255.)); 
01890         else 
01891           c = new TColor(ncolor+100,(Double_t)(red/255.),(Double_t)(green/255.),(Double_t)(blue/255.));
01892         vc.push_back(c);
01893         ncolor++;
01894       }
01895       for (int i=0;i<npoints;i++){
01896         tempfile >> x[i] >> y[i];  
01897       }
01898     }
01899     if(ncolor>0 && ncolor<10000){
01900       Int_t colors[10000];
01901       for(int i=0;i<ncolor;i++){colors[i]=i+100;}
01902       gStyle->SetPalette(ncolor,colors);
01903     }
01904     tempfile.clear();
01905     tempfile.seekg(0,std::ios::beg);
01906     std::cout << "created palette with " << ncolor << " colors" << std::endl;
01907     while(!tempfile.eof()) {//create polylines
01908       tempfile  >> red >> green  >> blue >> npoints; 
01909       for (int i=0;i<npoints;i++){
01910         tempfile >> x[i] >> y[i];  
01911       }
01912       colindex=red+green*1000+blue*1000000;
01913       pos=colorList.find(colindex); 
01914       if(pos != colorList.end()){
01915         TPolyLine*  pline = new TPolyLine(npoints,y,x);
01916         vp.push_back(pline);
01917         pline->SetFillColor(colorList[colindex]);
01918         pline->SetLineWidth(0);
01919         pline->Draw("f");
01920       }
01921     }
01922     MyC->Update();
01923     std::cout << "Filetype " << filetype << std::endl;
01924     if(filetype=="png"){
01925       std::string filename = outputfilename + ".png";
01926       MyC->Print(filename.c_str());
01927     }
01928     if(filetype=="jpg"){
01929       std::string filename = outputfilename + ".jpg";
01930       MyC->Print(filename.c_str());
01931     }
01932     if(filetype=="pdf"){
01933       std::string filename = outputfilename + ".pdf";
01934       MyC->Print(filename.c_str());
01935     }
01936     std::string command = "rm "+tempfilename ;
01937     command1=command.c_str();
01938     std::cout << "Executing " << command1 << std::endl;
01939     system(command1);
01940     MyC->Clear();
01941     delete MyC;
01942     for(std::vector<TPolyLine*>::iterator pos1=vp.begin();pos1!=vp.end();pos1++){
01943          delete (*pos1);}
01944    
01945 }//if(temporary_file)
01946 }//if(enabledFedProcessing)
01947 }
01948 
01949 void TrackerMap::save_as_fedtrackermap(bool print_total,float minval, float maxval,std::string s,int width, int height){
01950  if(enableFedProcessing){
01951   std::string filetype=s,outputfilename=s;
01952   std::vector<TPolyLine*> vp;
01953   
01954   size_t found=filetype.find_last_of(".");
01955   filetype=filetype.substr(found+1);
01956   found=outputfilename.find_last_of(".");
01957   outputfilename=outputfilename.substr(0,found);
01958   
01959   temporary_file=true;
01960   if(filetype=="xml"||filetype=="svg")temporary_file=false;
01961   std::ostringstream outs;
01962   minvalue=minval; maxvalue=maxval;
01963   outs << outputfilename << ".coor";
01964   if(temporary_file)savefile = new std::ofstream(outs.str().c_str(),std::ios::out);
01965   std::map<int , TmApvPair *>::iterator i_apv;
01966   std::map<int , int>::iterator i_fed;
01967   //Decide if we must use Module or ApvPair value
01968   bool useApvPairValue=false;
01969   for( i_apv=apvMap.begin();i_apv !=apvMap.end(); i_apv++){
01970     TmApvPair *  apvPair= i_apv->second;
01971     if(apvPair!=0) {
01972       TmModule * apv_mod = apvPair->mod;
01973       if(apv_mod !=0 && !apv_mod->notInUse()){
01974         if(apvPair->count > 0 || apvPair->red!=-1) { useApvPairValue=true; break;}
01975       }
01976     }
01977   }
01978   if(!print_total){
01979     for( i_apv=apvMap.begin();i_apv !=apvMap.end(); i_apv++){
01980       TmApvPair *  apvPair= i_apv->second;
01981       if(apvPair!=0) {
01982         TmModule * apv_mod = apvPair->mod;
01983         if(apv_mod !=0 && !apv_mod->notInUse()){
01984           if(useApvPairValue) apvPair->value = apvPair->value / apvPair->count;
01985           else if(apvPair->mpos==0)apv_mod->value = apv_mod->value / apv_mod->count;
01986         }
01987       }
01988     }
01989   }
01990   if(minvalue>=maxvalue){
01991     
01992     minvalue=9999999.;
01993     maxvalue=-9999999.;
01994     for(i_apv=apvMap.begin();i_apv !=apvMap.end(); i_apv++){
01995         TmApvPair *  apvPair= i_apv->second;
01996         if(apvPair!=0) {
01997           TmModule * apv_mod = apvPair->mod;
01998           if( apv_mod !=0 && !apv_mod->notInUse()){
01999             if(useApvPairValue){
02000               if (minvalue > apvPair->value)minvalue=apvPair->value;
02001               if (maxvalue < apvPair->value)maxvalue=apvPair->value;
02002             } else {
02003               if (minvalue > apv_mod->value)minvalue=apv_mod->value;
02004               if (maxvalue < apv_mod->value)maxvalue=apv_mod->value;
02005             }
02006           }
02007         }
02008     }
02009   }
02010      if(filetype=="svg"){
02011       saveAsSingleLayer=false;
02012       std::ostringstream outs;
02013     outs << outputfilename<<".svg";
02014     savefile = new std::ofstream(outs.str().c_str(),std::ios::out);
02015   *savefile << "<?xml version=\"1.0\"  standalone=\"no\" ?>"<<std::endl;
02016   *savefile << "<svg  xmlns=\"https://www.w3.org/2000/svg\""<<std::endl;
02017   *savefile << "xmlns:svg=\"https://www.w3.org/2000/svg\" "<<std::endl;
02018   *savefile << "xmlns:xlink=\"https://www.w3.org/1999/xlink\">"<<std::endl;
02019   *savefile << "<svg:svg id=\"mainMap\" x=\"0\" y=\"0\" viewBox=\"0 0 3000 1600"<<"\" width=\""<<width<<"\" height=\""<<height<<"\">"<<std::endl;
02020   *savefile << "<svg:rect fill=\"lightblue\" stroke=\"none\" x=\"0\" y=\"0\" width=\"3000\" height=\"1600\" /> "<<std::endl; 
02021   *savefile << "<svg:g id=\"fedtrackermap\" transform=\"translate(10,1500) rotate(270)\" style=\"fill:none;stroke:black;stroke-width:0;\"> "<<std::endl;
02022      }
02023   for (int crate=1; crate < (ncrates+1); crate++){
02024     if(filetype=="xml"){
02025       saveAsSingleLayer=true;
02026       std::ostringstream outs;
02027     outs << outputfilename<<"crate" <<crate<< ".xml";
02028     savefile = new std::ofstream(outs.str().c_str(),std::ios::out);
02029     *savefile << "<?xml version=\"1.0\" standalone=\"no\"?>"<<std::endl;
02030     *savefile << "<svg xmlns=\"https://www.w3.org/2000/svg\""<<std::endl;
02031     *savefile << "xmlns:svg=\"https://www.w3.org/2000/svg\""<<std::endl;
02032     *savefile << "xmlns:xlink=\"https://www.w3.org/1999/xlink\" >"<<std::endl;
02033     *savefile << "<script type=\"text/ecmascript\" xlink:href=\"crate.js\" />"<<std::endl;
02034     *savefile << "<svg id=\"mainMap\" x=\"0\" y=\"0\" viewBox=\"0 0  500 500\" width=\"700\" height=\"700\" onload=\"TrackerCrate.init()\">"<<std::endl;
02035     *savefile << "<rect fill=\"lightblue\" stroke=\"none\" x=\"0\" y=\"0\" width=\"700\" height=\"700\" />"<<std::endl;
02036     *savefile << "<g id=\"crate\" transform=\" translate(150,500) rotate(270) scale(1.,1.)\"  > "<<std::endl;
02037          }
02038     ncrate=crate;
02039     defcwindow(ncrate);
02040     int numfed_incrate=0;
02041     for (i_fed=fedMap.begin();i_fed != fedMap.end(); i_fed++){
02042       if(i_fed->second == crate){
02043         int fedId = i_fed->first;
02044         numfed_incrate++;
02045         for (int nconn=0;nconn<96;nconn++){
02046           int key = fedId*1000+nconn; 
02047           TmApvPair *  apvPair= apvMap[key];
02048           if(apvPair !=0){
02049             TmModule * apv_mod = apvPair->mod;
02050             if(apv_mod !=0 && !apv_mod->notInUse()){
02051               drawApvPair(crate,numfed_incrate,print_total,apvPair,savefile,useApvPairValue);
02052             }
02053           } 
02054         }
02055       }
02056     }
02057    if(!temporary_file){
02058     if(filetype=="xml"){
02059     *savefile << "</g> </svg> <text id=\"currentElementText\" x=\"40\" y=\"30\"> " << std::endl;
02060     *savefile << "<tspan id=\"line1\" x=\"40\" y=\"30\"> </tspan> " << std::endl;
02061     *savefile << "<tspan id=\"line2\" x=\"40\" y=\"60\"> </tspan> " << std::endl;
02062     *savefile << " </text> </svg>" << std::endl;
02063     savefile->close();delete savefile;
02064      saveAsSingleLayer=false;
02065       }
02066       }
02067     }
02068     if(filetype=="svg"){
02069     *savefile << "</g> </svg> </svg> " << std::endl;
02070     savefile->close();delete savefile;
02071       }
02072   if(!print_total && !useApvPairValue){
02073 //Restore module value
02074     for( i_apv=apvMap.begin();i_apv !=apvMap.end(); i_apv++){
02075       TmApvPair *  apvPair= i_apv->second;
02076       if(apvPair!=0) {
02077         TmModule * apv_mod = apvPair->mod;
02078         if(apv_mod !=0 && apvPair->mpos==0 && !apv_mod->notInUse()){
02079           apv_mod->value = apv_mod->value * apv_mod->count;
02080         }
02081       }
02082     }
02083 }
02084   
02085   if(temporary_file){
02086     //if(printflag)drawPalette(savefile);
02087   savefile->close(); delete savefile;
02088 
02089   const char * command1;
02090   std::string tempfilename = outputfilename + ".coor";
02091     int red,green,blue,npoints,colindex,ncolor;
02092     double x[4],y[4];
02093     ifstream tempfile(tempfilename.c_str(),std::ios::in);
02094     TCanvas *MyC = new TCanvas("MyC", "TrackerMap",width,height);
02095     gPad->SetFillColor(38);
02096     
02097     gPad->Range(0,0,3750,1600);
02098     
02099     //First  build palette
02100     ncolor=0;
02101     typedef std::map<int,int> ColorList;
02102     ColorList colorList;
02103     ColorList::iterator pos;
02104     TColor *col,*c;
02105     while(!tempfile.eof()) {
02106       tempfile  >> red >> green  >> blue >> npoints; 
02107       colindex=red+green*1000+blue*1000000;
02108       pos=colorList.find(colindex); 
02109       if(pos == colorList.end()){ 
02110         colorList[colindex]=ncolor+100; 
02111         col =gROOT->GetColor(ncolor+100);
02112         if(col) 
02113           col->SetRGB((Double_t)(red/255.),(Double_t)(green/255.),(Double_t)(blue/255.)); 
02114         else 
02115           c = new TColor(ncolor+100,(Double_t)(red/255.),(Double_t)(green/255.),(Double_t)(blue/255.));
02116         vc.push_back(c);
02117         ncolor++;
02118       }
02119       for (int i=0;i<npoints;i++){
02120         tempfile >> x[i] >> y[i];  
02121       }
02122     }
02123     if(ncolor>0 && ncolor<10000){
02124       Int_t colors[10000];
02125       for(int i=0;i<ncolor;i++){colors[i]=i+100;}
02126       gStyle->SetPalette(ncolor,colors);
02127     }
02128     tempfile.clear();
02129     tempfile.seekg(0,std::ios::beg);
02130     std::cout << "created palette with " << ncolor << " colors" << std::endl;
02131     while(!tempfile.eof()) {//create polylines
02132       tempfile  >> red >> green  >> blue >> npoints; 
02133       for (int i=0;i<npoints;i++){
02134         tempfile >> x[i] >> y[i];  
02135       }
02136       colindex=red+green*1000+blue*1000000;
02137       pos=colorList.find(colindex); 
02138       if(pos != colorList.end()){
02139         TPolyLine*  pline = new TPolyLine(npoints,y,x);
02140         vp.push_back(pline);
02141         pline->SetFillColor(colorList[colindex]);
02142         pline->SetLineWidth(0);
02143         pline->Draw("f");
02144       }
02145     }
02146     MyC->Update();
02147     std::cout << "Filetype " << filetype << std::endl;
02148     if(filetype=="png"){
02149       std::string filename = outputfilename + ".png";
02150       MyC->Print(filename.c_str());
02151     }
02152     if(filetype=="jpg"){
02153       std::string filename = outputfilename + ".jpg";
02154       MyC->Print(filename.c_str());
02155     }
02156     if(filetype=="pdf"){
02157       std::string filename = outputfilename + ".pdf";
02158       MyC->Print(filename.c_str());
02159     }
02160     std::string command = "rm "+tempfilename ;
02161     command1=command.c_str();
02162     std::cout << "Executing " << command1 << std::endl;
02163     system(command1);
02164     MyC->Clear();
02165     delete MyC;
02166     for(std::vector<TPolyLine*>::iterator pos1=vp.begin();pos1!=vp.end();pos1++){
02167          delete (*pos1);}
02168    
02169   
02170 }//if(temporary_file)
02171 }//if(enabledFedProcessing)
02172 }
02173 
02174 void TrackerMap::load(std::string inputfilename){
02175   inputfile = new ifstream(inputfilename.c_str(),std::ios::in);
02176   std::string line,value;
02177   int ipos,ipos1,ipos2,id=0,val=0;
02178   int nline=0;
02179   while (getline( *inputfile, line ))
02180         {
02181         ipos1 = line.find("value=\"");
02182         if(ipos1 > 0)      {
02183              value = line.substr(ipos1+7,10);
02184              ipos = value.find("\"");
02185              value = value.substr(0,ipos); 
02186              val=atoi(value.c_str());
02187              }
02188         ipos2 = line.find("detid=\"");
02189         if(ipos2 > 0)      {
02190              value = line.substr(ipos2+7,10);
02191              ipos = value.find("\"");
02192              value = value.substr(0,ipos); 
02193              id = atoi(value.c_str());
02194              }
02195         if(ipos1>0 && ipos2>0 && val>0)this->fill(id,val);
02196         if(ipos1>0 && ipos2>0)nline++;
02197         //if(ipos1>0 && ipos2>0)std::cout << nline << " " << id << " " << val << std::endl; 
02198 
02199         }
02200        std::cout << nline << " modules found in this svg file " << std::endl;
02201        inputfile->close();delete inputfile;
02202  }
02203 
02204 
02205 
02206 //print in svg format tracker map
02207 //print_total = true represent in color the total stored in the module
02208 //print_total = false represent in color the average  
02209 void TrackerMap::print(bool print_total, float minval, float maxval, std::string outputfilename){
02210   temporary_file=false;
02211   std::ostringstream outs;
02212   minvalue=minval; maxvalue=maxval;
02213   outs << outputfilename << ".xml";
02214   svgfile = new std::ofstream(outs.str().c_str(),std::ios::out);
02215   jsfile = new ifstream(edm::FileInPath(jsfilename).fullPath().c_str(),std::ios::in);
02216 
02217   //copy javascript interface from trackermap.txt file
02218   std::string line;
02219   while (getline( *jsfile, line ))
02220         {
02221             *svgfile << line << std::endl;
02222         }
02223   jsfile->close();delete jsfile;
02224   //
02225  if(!print_total){
02226   for (int layer=1; layer < 44; layer++){
02227     for (int ring=firstRing[layer-1]; ring < ntotRing[layer-1]+firstRing[layer-1];ring++){
02228       for (int module=1;module<200;module++) {
02229         int key=layer*100000+ring*1000+module;
02230         TmModule * mod = smoduleMap[key];
02231         if(mod !=0 && !mod->notInUse()){
02232           mod->value = mod->value / mod->count;
02233         }
02234       }
02235     }
02236   }
02237   }
02238   if(minvalue>=maxvalue){
02239   minvalue=9999999.;
02240   maxvalue=-9999999.;
02241   for (int layer=1; layer < 44; layer++){
02242     for (int ring=firstRing[layer-1]; ring < ntotRing[layer-1]+firstRing[layer-1];ring++){
02243       for (int module=1;module<200;module++) {
02244         int key=layer*100000+ring*1000+module;
02245         TmModule * mod = smoduleMap[key];
02246         if(mod !=0 && !mod->notInUse()){
02247           if (minvalue > mod->value)minvalue=mod->value;
02248           if (maxvalue < mod->value)maxvalue=mod->value;
02249         }
02250       }
02251     }
02252   }
02253 }
02254   for (int layer=1; layer < 44; layer++){
02255     nlay=layer;
02256     defwindow(nlay);
02257     for (int ring=firstRing[layer-1]; ring < ntotRing[layer-1]+firstRing[layer-1];ring++){
02258       for (int module=1;module<200;module++) {
02259         int key=layer*100000+ring*1000+module;
02260         TmModule * mod = smoduleMap[key];
02261         if(mod !=0 && !mod->notInUse()){
02262           drawModule(mod,key,layer,print_total,svgfile);
02263         }
02264       }
02265     }
02266   }
02267   *svgfile << "</svg:g></svg:svg>"<<std::endl;
02268   *svgfile << " <svg:text id=\"Title\" class=\"normalText\"  x=\"300\" y=\"0\">"<<title<<"</svg:text>"<<std::endl;
02269   if(printflag)drawPalette(svgfile);
02270   *svgfile << "</svg:svg>"<<std::endl;
02271   *svgfile << "</body></html>"<<std::endl;
02272    svgfile->close();delete svgfile;
02273 
02274 }
02275 
02276 void TrackerMap::drawPalette(std::ofstream * svgfile){
02277   int color,red, green, blue;
02278   float val=minvalue;
02279   int paletteLength = 250;
02280   float dval = (maxvalue-minvalue)/(float)paletteLength;
02281   for(int i=0;i<paletteLength;i++){
02282   color = getcolor(val,palette);
02283      red=(color>>16)&0xFF;
02284      green=(color>>8)&0xFF;
02285      blue=(color)&0xFF;
02286  //   if(!temporary_file)*svgfile <<"<svg:rect  x=\"3010\" y=\""<<(1550-6*i)<<"\" width=\"50\" height=\"6\" fill=\"rgb("<<red<<","<<green<<","<<blue<<")\" />\n"; 
02287   //  else *svgfile << red << " " << green << " " << blue << " 4 " << (6*i)+40 << " 3010. " <<//
02288    //           (6*i)+40 << " 3060. " <<//
02289     //          (6*(i-1))+40 << " 3060. " <<//
02290      //         (6*(i-1))+40 <<" 3010. " << std::endl; //
02291 
02292    // if(i%50 == 0){
02293     //  if(!temporary_file)*svgfile <<"<svg:rect  x=\"3010\" y=\""<<(1550-6*i)<<"\" width=\"50\" height=\"1\" fill=\"black\" />\n";
02294      // if(i%50==0&&!temporary_file)*svgfile << " <svg:text  class=\"normalText\"  x=\"3060\" y=\""<<(1560-6*i)<<"\">" <<val<<"</svg:text>"<<std::endl;
02295 
02296     if(!temporary_file)*svgfile <<"<svg:rect  x=\"3610\" y=\""<<(1550-6*i)<<"\" width=\"50\" height=\"6\" fill=\"rgb("<<red<<","<<green<<","<<blue<<")\" />\n"; 
02297     else *svgfile << red << " " << green << " " << blue << " 4 " << (6*i)+40 << " 3610. " <<//
02298               (6*i)+40 << " 3660. " <<//
02299               (6*(i-1))+40 << " 3660. " <<//
02300               (6*(i-1))+40 <<" 3610. " << std::endl; //
02301 
02302     if(i%50 == 0){
02303      if(!temporary_file)*svgfile <<"<svg:rect  x=\"3610\" y=\""<<(1550-6*i)<<"\" width=\"50\" height=\"1\" fill=\"black\" />\n";
02304       if(i%50==0&&!temporary_file)*svgfile << " <svg:text  class=\"normalText\"  x=\"3660\" y=\""<<(1560-6*i)<<"\">" <<val<<"</svg:text>"<<std::endl;
02305        }
02306     val = val + dval;
02307    }
02308 } 
02309 void TrackerMap::fillc_fed_channel(int fedId,int fedCh, int red, int green, int blue  )
02310 {
02311   int key = fedId*1000+fedCh;
02312   TmApvPair* apvpair = apvMap[key];
02313   
02314   if(apvpair!=0){
02315     apvpair->red=red; apvpair->green=green; apvpair->blue=blue;
02316     return;
02317   }
02318   std::cout << "*** error in FedTrackerMap fillc method ***";
02319 }
02320 
02321 void TrackerMap::fill_fed_channel(int idmod, float qty  )
02322 {
02323   std::multimap<const int, TmApvPair*>::iterator pos;
02324   for (pos = apvModuleMap.lower_bound(idmod);
02325          pos != apvModuleMap.upper_bound(idmod); ++pos) {
02326   TmApvPair* apvpair = pos->second;
02327   if(apvpair!=0){
02328     apvpair->value=apvpair->value+qty;
02329     apvpair->count++;
02330   }
02331   }
02332     return;
02333   std::cout << "*** error in FedTrackerMap fill by module method ***";
02334   }
02335 
02336 void TrackerMap::fill_current_val_fed_channel(int fedId, int fedCh, float current_val )
02337 {
02338   int key = fedId*1000+fedCh;
02339   TmApvPair* apvpair = apvMap[key];
02340   
02341   if(apvpair!=0)  {apvpair->value=current_val; apvpair->count=1; apvpair->red=-1;}
02342   else 
02343     std::cout << "*** error in FedTrackerMap fill_current_val method ***";
02344 }
02345 
02346 
02347 void TrackerMap::fillc_fec_channel(int crate,int slot, int ring, int addr, int red, int green, int blue  )
02348  {
02349  int key =crate*10000000+slot*100000+ring*1000+addr;
02350 
02351  TmCcu *ccu = ccuMap[key];
02352  
02353  if(ccu!=0){
02354     ccu->red=red; ccu->green=green; ccu->blue=blue;
02355     return;
02356   }
02357   std::cout << "*** error in FecTrackerMap fillc method ***";
02358 }
02359 
02360 void TrackerMap::fill_fec_channel(int crate,int slot, int ring, int addr, float qty  )
02361 {
02362  int key =crate*10000000+slot*100000+ring*1000+addr;
02363  TmCcu *ccu = ccuMap[key];
02364   if(ccu!=0){
02365     ccu->count++; ccu->value=ccu->value+qty;
02366     return;
02367  
02368   }
02369   
02370   std::cout << "*** error in FecTrackerMap fill by module method ***";
02371   }
02372 
02373  
02374 
02375 void TrackerMap::fillc_lv_channel(int rack,int crate, int board, int red, int green, int blue  )
02376 {
02377  
02378  int key = rack*1000+crate*100+board;
02379  
02380  TmPsu *psu = psuMap[key];
02381   
02382   if(psu!=0){
02383     psu->red=red; psu->green=green; psu->blue=blue;
02384     return;
02385   }
02386   std::cout << "*** error in LVTrackerMap fillc method ***";
02387 }
02388 
02389 void TrackerMap::fill_lv_channel(int rack,int crate, int board, float qty  )
02390 {
02391  int key = rack*1000+crate*100+board;
02392  TmPsu *psu = psuMap[key];
02393   if(psu!=0){
02394     psu->count++; psu->value=psu->value+qty;
02395     return;
02396  
02397   }
02398   
02399   std::cout << "*** error in LVTrackerMap fill by module method ***";
02400   }
02401 
02402 void TrackerMap::fillc_hv_channel2(int rack,int crate, int board, int red, int green, int blue  )
02403 {
02404  
02405  int key = rack*1000+crate*100+board;
02406  
02407  TmPsu *psu = psuMap[key];
02408   
02409   if(psu!=0){
02410     psu->redHV2=red; psu->greenHV2=green; psu->blueHV2=blue;
02411     return;
02412   }
02413   std::cout << "*** error in HVTrackerMap (channel 2) fillc method ***";
02414 }
02415 void TrackerMap::fillc_hv_channel3(int rack,int crate, int board, int red, int green, int blue  )
02416 {
02417  
02418  int key = rack*1000+crate*100+board;
02419  
02420  TmPsu *psu = psuMap[key];
02421   
02422   if(psu!=0){
02423     psu->redHV3=red; psu->greenHV3=green; psu->blueHV3=blue;
02424     return;
02425   }
02426   std::cout << "*** error in HVTrackerMap (channel 3) fillc method ***";
02427 }
02428 
02429 
02430 void TrackerMap::fill_hv_channel2(int rack,int crate, int board, float qty  )
02431 {
02432  int key = rack*1000+crate*100+board;
02433  TmPsu *psu = psuMap[key];
02434   if(psu!=0){
02435     psu->countHV2++; psu->valueHV2=psu->valueHV2+qty;
02436     return;
02437  
02438   }
02439   
02440   std::cout << "*** error in HVTrackerMap fill by module method ***";
02441   }
02442 void TrackerMap::fill_hv_channel3(int rack,int crate, int board, float qty  )
02443 {
02444  int key = rack*1000+crate*100+board;
02445  TmPsu *psu = psuMap[key];
02446   if(psu!=0){
02447     psu->countHV3++; psu->valueHV3=psu->valueHV3+qty;
02448     return;
02449  
02450   }
02451   
02452   std::cout << "*** error in HVTrackerMap fill by module method ***";
02453   }
02454 
02455 
02456 
02457 
02458 
02459 int TrackerMap::module(int fedId, int fedCh)
02460 {
02461   int key = fedId*1000+fedCh;
02462   TmApvPair* apvpair = apvMap[key];
02463   if(apvpair!=0){
02464     return(apvpair->mod->idex);
02465   }
02466   return(0);
02467   std::cout << "*** error in FedTrackerMap module method ***";
02468 }
02469 void TrackerMap::fill_fed_channel(int fedId, int fedCh, float qty )
02470 {
02471   int key = fedId*1000+fedCh;
02472   TmApvPair* apvpair = apvMap[key];
02473   if(apvpair!=0){
02474     apvpair->value=apvpair->value+qty;
02475     apvpair->count++;
02476     return;
02477   }
02478   std::cout << "*** error inFedTrackerMap fill method ***";
02479 }
02480 
02481 
02482 void TrackerMap::fillc(int idmod, int red, int green, int blue  ){
02483 
02484   TmModule * mod = imoduleMap[idmod];
02485   if(mod!=0){
02486      mod->red=red; mod->green=green; mod->blue=blue;
02487      return;
02488   }
02489   std::cout << "**************************error in fill method **************module "<<idmod<<std::endl;
02490 }
02491 void TrackerMap::fillc(int layer, int ring, int nmod, int red, int green, int blue  ){
02492   
02493   int key = layer*10000+ring*1000+nmod;
02494   TmModule * mod = smoduleMap[key];
02495 
02496   if(mod!=0){
02497      mod->red=red; mod->green=green; mod->blue=blue;
02498     return;
02499   }
02500   std::cout << "**************************error in fill method **************"<< std::endl;
02501 }
02502 
02503 void TrackerMap::fillc_all_blank(){
02504 
02505   std::map<const int  , TmModule *>::iterator imod;
02506    for( imod=imoduleMap.begin();imod !=imoduleMap.end(); imod++){
02507    fillc(imod->first,255,255,255); 
02508    }
02509 }
02510 
02511 void TrackerMap::fill_all_blank(){
02512 
02513   std::map<const int  , TmModule *>::iterator imod;
02514    for( imod=imoduleMap.begin();imod !=imoduleMap.end(); imod++){
02515    fill_current_val(imod->first,0); 
02516    }
02517 }
02518 
02519 
02520 
02521 void TrackerMap::fill_current_val(int idmod, float current_val ){
02522 
02523   TmModule * mod = imoduleMap[idmod];
02524   if(mod!=0)  {mod->value=current_val; mod->count=1;  mod->red=-1;}
02525   else std::cout << "**error in fill_current_val method ***module "<<idmod<<std::endl;
02526 }
02527 
02528 void TrackerMap::fill(int idmod, float qty ){
02529 
02530   TmModule * mod = imoduleMap[idmod];
02531   if(mod!=0){
02532     mod->value=mod->value+qty;
02533     mod->count++;
02534     return;
02535   }else{
02536    TmModule * mod1 = imoduleMap[idmod+1];
02537    TmModule * mod2 = imoduleMap[idmod+2];
02538    if(mod1!=0 && mod2!=0){
02539     mod1->value=mod1->value+qty;
02540     mod1->count++;
02541     mod2->value=mod2->value+qty;
02542     mod2->count++;
02543     return;
02544    }}
02545   std::cout << "**************************error in fill method **************module "<<idmod<<std::endl;
02546 }
02547 
02548 void TrackerMap::fill(int layer, int ring, int nmod,  float qty){
02549 
02550   int key = layer*100000+ring*1000+nmod;
02551   TmModule * mod = smoduleMap[key];
02552   if(mod!=0){
02553      mod->value=mod->value+qty;
02554      mod->count++;
02555   }
02556   else std::cout << "**************************error in SvgModuleMap **************";
02557 } 
02558 
02559 void TrackerMap::setText(int idmod, std::string s){
02560 
02561   TmModule * mod = imoduleMap[idmod];
02562   if(mod!=0){
02563      mod->text=s;
02564   }
02565   else std::cout << "**************************error in IdModuleMap **************";
02566 }
02567 
02568 
02569 void TrackerMap::setText(int layer, int ring, int nmod, std::string s){
02570 
02571   int key = layer*100000+ring*1000+nmod;
02572   TmModule * mod = smoduleMap[key];
02573   if(mod!=0){
02574      mod->text=s;
02575   }
02576   else std::cout << "**************************error in SvgModuleMap **************";
02577 } 
02578 
02579 void TrackerMap::build(){
02580   //  ifstream* infile;
02581 
02582   int nmods, pix_sil, fow_bar, ring, nmod, layer;
02583   unsigned int idex;
02584   float posx, posy, posz, length, width, thickness, widthAtHalfLength;
02585   int iModule=0,old_layer=0, ntotMod =0;
02586   std::string name,dummys;
02587   ifstream infile(edm::FileInPath(infilename).fullPath().c_str(),std::ios::in);
02588   while(!infile.eof()) {
02589     infile >> nmods >> pix_sil >> fow_bar >> layer >> ring >> nmod >> posx >> posy
02590            >> posz>> length >> width >> thickness
02591            >> widthAtHalfLength >> idex ;
02592     getline(infile,dummys); //necessary to reach end of record
02593     getline(infile,name); 
02594     if(old_layer!=layer){old_layer=layer;iModule=0;}
02595     iModule++;
02596     ntotMod++;
02597     int key=layer*100000+ring*1000+nmod;
02598     TmModule * mod = smoduleMap[key];
02599     
02600     imoduleMap[idex]=mod;
02601 
02602     if(mod==0) std::cout << "error in module "<<key <<std::endl;
02603     else
02604       {
02605           mod->posx = posx;
02606           mod->posy = posy;
02607           mod->setUsed();
02608           mod->value=0;
02609           mod->count=0;
02610           mod->posz = posz;
02611           mod->length = length;
02612           mod->width = width;
02613           mod->thickness = thickness;
02614           mod->widthAtHalfLength = widthAtHalfLength;
02615           mod->idex = idex;
02616           mod->name = name;
02617       }
02618   }
02619   infile.close();
02620   number_modules = ntotMod-1;
02621 }
02622 int TrackerMap::getcolor(float value,int palette){
02623    int red,green,blue;
02624    red=0;green=0;blue=0;
02625    if(palette==1){//palette1 1 - raibow
02626    float delta=(maxvalue-minvalue);
02627    float x =(value-minvalue);
02628    if(value<minvalue){red=0;green=0;blue=255;}
02629    if(value>maxvalue){red=255;green=0;blue=0;}
02630    if(value>=minvalue&&value<=maxvalue){ 
02631    red = (int) ( x<(delta/2) ? 0 : ( x > ((3./4.)*delta) ?  255 : 255/(delta/4) * (x-(2./4.)*delta)  ) );
02632    green= (int) ( x<delta/4 ? (x*255/(delta/4)) : ( x > ((3./4.)*delta) ?  255-255/(delta/4) *(x-(3./4.)*delta) : 255 ) );
02633    blue = (int) ( x<delta/4 ? 255 : ( x > ((1./2.)*delta) ?  0 : 255-255/(delta/4) * (x-(1./4.)*delta) ) );
02634      }
02635      }
02636      if (palette==2){//palette 2 yellow-green
02637      green = (int)((value-minvalue)/(maxvalue-minvalue)*256.);
02638          if (green > 255) green=255;
02639          red = 255; blue=0;green=255-green;  
02640         } 
02641    return(blue|(green<<8)|(red<<16));
02642 }
02643 void TrackerMap::printonline(){
02644 //Copy interface
02645   std::ofstream * ofilename;
02646   std::ifstream * ifilename;
02647   std::ostringstream ofname;
02648   std::string ifname;
02649   std::string command;
02650   std::string line;
02651   std::string outputfilename="dqmtmap";
02652   ifilename=findfile("viewerHeader.xhtml");
02653   ofname << outputfilename << "viewer.html";
02654   ofilename = new std::ofstream(ofname.str().c_str(),std::ios::out);
02655   while (getline( *ifilename, line )) { *ofilename << line << std::endl; }
02656 *ofilename <<"    var tmapname=\"" <<outputfilename << "\""<<std::endl;
02657 *ofilename <<"    var tmaptitle=\"" <<title << "\""<<std::endl;
02658 *ofilename <<"    var ncrates=" <<ncrates << ";"<<std::endl;
02659 *ofilename <<"    var nfeccrates=" <<nfeccrates << ";"<<std::endl;
02660  *ofilename <<"    var npsuracks=" <<npsuracks << ";"<<std::endl;
02661  
02662    ifilename->close();delete ifilename;
02663 
02664   ifilename=findfile("viewerTrailer.xhtml");
02665   while (getline( *ifilename, line )) { *ofilename << line << std::endl; }
02666    ofilename->close();delete ofilename;
02667    command = "sed -i \"s/XtmapnameX/"+outputfilename+"/g\" "+ ofname.str();
02668     std::cout << "Executing " << command << std::endl;
02669     system(command.c_str());
02670    command = "sed -i \"s/XtmaptitleX/"+title+"/g\" "+ ofname.str();
02671     std::cout << "Executing " << command << std::endl;
02672     system(command.c_str());
02673   ofname.str("");
02674    ifilename->close();delete ifilename;
02675 
02676   ifilename=findfile("jqviewer.js");
02677   ofname << "jqviewer.js";
02678   ofilename = new std::ofstream(ofname.str().c_str(),std::ios::out);
02679   while (getline( *ifilename, line )) { *ofilename << line << std::endl; }
02680   ofname.str("");
02681    ofilename->close();delete ofilename;
02682    ifilename->close();delete ifilename;
02683 
02684   ifilename=findfile("crate.js");
02685   ofname <<  "crate.js";
02686   ofilename = new std::ofstream(ofname.str().c_str(),std::ios::out);
02687   while (getline( *ifilename, line )) { *ofilename << line << std::endl; }
02688   ofname.str("");
02689    ofilename->close();delete ofilename;
02690    ifilename->close();delete ifilename;
02691 
02692   ifilename=findfile("feccrate.js");
02693   ofname <<  "feccrate.js";
02694   ofilename = new std::ofstream(ofname.str().c_str(),std::ios::out);
02695   while (getline( *ifilename, line )) { *ofilename << line << std::endl; }
02696   ofname.str("");
02697    ofilename->close();delete ofilename;
02698    ifilename->close();delete ifilename;
02699   
02700   ifilename=findfile("layer.js");
02701   ofname <<  "layer.js";
02702   ofilename = new std::ofstream(ofname.str().c_str(),std::ios::out);
02703   while (getline( *ifilename, line )) { *ofilename << line << std::endl; }
02704    ofname.str("");
02705    ofilename->close();delete ofilename;
02706    ifilename->close();delete ifilename;
02707   
02708   ifilename=findfile("rack.js");
02709   ofname <<  "rack.js";
02710   ofilename = new std::ofstream(ofname.str().c_str(),std::ios::out);
02711   while (getline( *ifilename, line )) { *ofilename << line << std::endl; }
02712    ofname.str("");
02713    ofilename->close();delete ofilename;
02714    ifilename->close();delete ifilename;
02715    ofname.str("");
02716   
02717   ifilename=findfile("rackhv.js");
02718   ofname <<  "rackhv.js";
02719   ofilename = new std::ofstream(ofname.str().c_str(),std::ios::out);
02720   while (getline( *ifilename, line )) { *ofilename << line << std::endl; }
02721    ofname.str("");
02722    ofilename->close();delete ofilename;
02723    ifilename->close();delete ifilename;
02724     
02725     
02726     
02727     
02728    std::ostringstream outs,outs1,outs2;
02729     outs << outputfilename<<".png";
02730 save(true,gminvalue,gmaxvalue,outs.str(),3000,1600);
02731 temporary_file=false;
02732 printlayers(true,gminvalue,gmaxvalue,outputfilename);
02733 
02734 //Now print a text file for each layer 
02735   std::ofstream * txtfile;
02736 for (int layer=1; layer < 44; layer++){
02737   std::ostringstream outs;
02738     outs << outputfilename <<"layer"<<layer<< ".html";
02739     txtfile = new std::ofstream(outs.str().c_str(),std::ios::out);
02740     *txtfile << "<html><head></head> <body>" << std::endl;
02741     for (int ring=firstRing[layer-1]; ring < ntotRing[layer-1]+firstRing[layer-1];ring++){
02742       for (int module=1;module<200;module++) {
02743         int key=layer*100000+ring*1000+module;
02744         TmModule * mod = smoduleMap[key];
02745         if(mod !=0 && !mod->notInUse()){
02746             int idmod=mod->idex;
02747             int nchan=0;
02748             *txtfile  << "<a name="<<idmod<<"><pre>"<<std::endl;
02749              std::multimap<const int, TmApvPair*>::iterator pos;
02750              for (pos = apvModuleMap.lower_bound(idmod);
02751                 pos != apvModuleMap.upper_bound(idmod); ++pos) {
02752                TmApvPair* apvpair = pos->second;
02753                if(apvpair!=0){
02754                    nchan++;
02755                    *txtfile  <<  apvpair->text << std::endl;
02756                     }
02757 
02758                     }
02759                    *txtfile  << "</pre><h3>"<< mod->name<<"</h3>"<<std::endl;
02760                   }
02761                 }
02762                 }
02763     *txtfile << "</body></html>" << std::endl;
02764     txtfile->close();delete txtfile;
02765                 }
02766 if(enableFedProcessing){
02767     outs1 << outputfilename<<"fed.png";
02768 save_as_fedtrackermap(true,gminvalue,gmaxvalue,outs1.str(),6000,3200);
02769     outs2 << outputfilename<<".xml";
02770 save_as_fedtrackermap(true,gminvalue,gmaxvalue,outs2.str(),3000,1600);
02771 //And a text file for each crate 
02772   std::map<int , int>::iterator i_fed;
02773   std::ofstream * txtfile;
02774   for (int crate=1; crate < (ncrates+1); crate++){
02775     std::ostringstream outs;
02776     outs << outputfilename <<"crate"<<crate<< ".html";
02777     txtfile = new std::ofstream(outs.str().c_str(),std::ios::out);
02778     *txtfile << "<html><head></head> <body>" << std::endl;
02779     for (i_fed=fedMap.begin();i_fed != fedMap.end(); i_fed++){
02780       if(i_fed->second == crate){
02781         int fedId = i_fed->first;
02782         for (int nconn=0;nconn<96;nconn++){
02783           int key = fedId*1000+nconn; 
02784           TmApvPair *  apvPair= apvMap[key];
02785           if(apvPair !=0){
02786             int idmod=apvPair->idex;
02787             *txtfile  << "<a name="<<idmod<<"><pre>"<<std::endl;
02788             *txtfile  <<  apvPair->text << std::endl;
02789             std::ostringstream outs;
02790             outs << "fedchannel "  <<apvPair->getFedId() << "/"<<apvPair->getFedCh()<<" connects to module  " << apvPair->mod->idex ;
02791             *txtfile  << "</pre><h3>"<< outs.str()<<"</h3>"<<std::endl;
02792              }
02793           }
02794       }
02795       }
02796     *txtfile << "</body></html>" << std::endl;
02797     txtfile->close();delete txtfile;
02798                 }
02799   }
02800 if(enableFecProcessing){
02801   std::ostringstream outs1,outs2;
02802     outs1 << outputfilename<<"fec.png";
02803 save_as_fectrackermap(true,gminvalue,gmaxvalue,outs1.str(),6000,3200);
02804     outs2 << outputfilename<<".xml";
02805 save_as_fectrackermap(true,gminvalue,gmaxvalue,outs2.str(),3000,1600);
02806 //And a text file for each crate
02807   std::ofstream * txtfile;
02808   std::map<int , TmCcu *>::iterator i_ccu;
02809   std::multimap<TmCcu*, TmModule*>::iterator it;
02810   std::pair<std::multimap<TmCcu*, TmModule*>::iterator,std::multimap<TmCcu*, TmModule*>::iterator> ret;
02811   for (int crate=1; crate < (nfeccrates+1); crate++){
02812     std::ostringstream outs;
02813     outs << outputfilename <<"feccrate"<<crate<< ".html";
02814     txtfile = new std::ofstream(outs.str().c_str(),std::ios::out);
02815     *txtfile << "<html><head></head> <body>" << std::endl;
02816     for( i_ccu=ccuMap.begin();i_ccu !=ccuMap.end(); i_ccu++){
02817      TmCcu *  ccu= i_ccu->second;
02818       if(ccu!=0&&ccu->getCcuCrate() == crate){
02819             int idmod=ccu->idex;
02820             *txtfile  << "<a name="<<idmod<<"><pre>"<<std::endl;
02821             *txtfile  <<  ccu->text << std::endl;
02822             std::ostringstream outs;
02823             if(ccu->nmod==0)outs << "ccu  is in position" << ccu->mpos<<"in ring but doesn't seem to have any module connected"; else
02824             {
02825             outs << "ccu  is in position " << ccu->mpos<<" in ring and connects  " <<ccu->nmod<< " modules" << std::endl;
02826             ret = fecModuleMap.equal_range(ccu);
02827         for (it = ret.first; it != ret.second; ++it)
02828           {
02829            outs << (*it).second->idex<<" " << (*it).second->name <<" value= "<< (*it).second->value<<"\n\n";
02830           }
02831 
02832             *txtfile  << "</pre><h4>"<< outs.str()<<"</h4>"<<std::endl;
02833           }//ifccu->nmod==0
02834       }//if ccu!=0
02835       }//for i_ccu
02836     *txtfile << "</body></html>" << std::endl;
02837     txtfile->close();delete txtfile;
02838                 }//for int crate
02839   }
02840 if(enableLVProcessing){
02841   std::ostringstream outs3,outs4;
02842     outs3 << outputfilename<<"psu.png";
02843 save_as_psutrackermap(true,gminvalue,gmaxvalue,outs3.str(),6000,3200);
02844 
02845     outs4 << outputfilename<<".xml";
02846 save_as_psutrackermap(true,gminvalue,gmaxvalue,outs4.str(),3000,1600);
02847 //And a text file for each rack 
02848   
02849   std::ofstream * txtfile;
02850   std::map<int , TmPsu *>::iterator ipsu;
02851   std::multimap<TmPsu*, TmModule*>::iterator it;
02852   std::pair<std::multimap<TmPsu*, TmModule*>::iterator,std::multimap<TmPsu*, TmModule*>::iterator> ret;
02853   for (int rack=1; rack < (npsuracks+1); rack++){
02854     std::ostringstream outs;
02855     
02856     outs << outputfilename <<"psurack"<<rack<< ".html";
02857     txtfile = new std::ofstream(outs.str().c_str(),std::ios::out);
02858     *txtfile << "<html><head></head> <body>" << std::endl;
02859      for ( ipsu=psuMap.begin();ipsu !=psuMap.end(); ipsu++){
02860       TmPsu *  psu= ipsu->second;
02861       if(psu!=0 && psu->getPsuRack() == rack){
02862         *txtfile  << "<a name="<<psu->idex<<"><pre>"<<std::endl;      
02863         *txtfile  <<  psu->text << std::endl;
02864         std::ostringstream outs;
02865         if(psu->nmod==0)outs << "Ps is in position" << psu->getPsuBoard()<<"in crate but doesn't seem to have any module connected"; else
02866         {
02867         outs<< "PS is in position "  <<psu->getPsuBoard()<< " in crate and connects to "<<psu->nmod<<" modules. "<<std::endl;
02868         
02869         ret = psuModuleMap.equal_range(psu);
02870         for (it = ret.first; it != ret.second; ++it)
02871           {
02872            outs <<(*it).second->idex << " "<< (*it).second->name<<" value= "<<(*it).second->value<<" <br>"<<std::endl;
02873            
02874           }
02875         *txtfile  << "</pre><h4>"<< outs.str()<<"</h4>"<<std::endl;
02876      }
02877     }
02878   }
02879   *txtfile << "</body></html>" << std::endl;
02880    txtfile->close();delete txtfile;
02881   }
02882  } 
02883 
02884 
02885 if(enableHVProcessing){
02886   std::ostringstream outs5,outs6;
02887     outs5 << outputfilename<<"hv.png";
02888 save_as_HVtrackermap(true,gminvalue,gmaxvalue,outs5.str(),6000,3200);
02889 
02890     outs6 << outputfilename<<".xml";
02891 save_as_HVtrackermap(true,gminvalue,gmaxvalue,outs6.str(),3000,1600);
02892 //And a text file for each rack 
02893 
02894  std::ofstream * txtfile;
02895   std::map<int , TmPsu *>::iterator ipsu;
02896   std::multimap<TmPsu*, TmModule*>::iterator it;
02897   std::pair<std::multimap<TmPsu*, TmModule*>::iterator,std::multimap<TmPsu*, TmModule*>::iterator> ret;
02898   for (int rack=1; rack < (npsuracks+1); rack++){
02899     std::ostringstream outs;
02900     
02901     outs << outputfilename <<"HVrack"<<rack<< ".html";
02902     txtfile = new std::ofstream(outs.str().c_str(),std::ios::out);
02903     *txtfile << "<html><head></head> <body>" << std::endl;
02904      for ( ipsu=psuMap.begin();ipsu !=psuMap.end(); ipsu++){
02905       TmPsu *  psu= ipsu->second;
02906       if(psu!=0 && psu->getPsuRack() == rack){
02907         *txtfile  << "<a name="<<psu->idex<<"><pre>"<<std::endl;      
02908         *txtfile  <<  psu->textHV2 << std::endl;
02909         std::ostringstream outsHV2;
02910         if(psu->nmodHV2==0)outsHV2 << "HV Channel002 is in position" << psu->getPsuBoard()<<"in crate but doesn't seem to have any module connected"; else
02911         {
02912         outsHV2<< "HV Channel002 is in position "  <<psu->getPsuBoard()<< " in crate and connects to "<<psu->nmodHV2<<" modules. "<<" <br>"<<std::endl;
02913         
02914         ret = psuModuleMap.equal_range(psu);
02915         for (it = ret.first; it != ret.second; ++it)
02916           {
02917            if((*it).second->HVchannel==2){outsHV2 <<(*it).second->idex << " "<< (*it).second->name<<" value= "<<(*it).second->value<<" <br>"<<std::endl;}
02918           }
02919         *txtfile  << "</pre><h4>"<< outsHV2.str()<<"</h4>"<<std::endl;
02920      }
02921     
02922         *txtfile  <<  psu->textHV3 << std::endl;
02923         std::ostringstream outsHV3;
02924         if(psu->nmodHV3==0)outsHV3 << "HV Channel003 is in position" << psu->getPsuBoard()<<"in crate but doesn't seem to have any module connected"; else
02925         {
02926         outsHV3<< "HV Channel003 is in position "  <<psu->getPsuBoard()<< " in crate and connects to "<<psu->nmodHV3<<" modules. "<<" <br>"<<std::endl;
02927         
02928         ret = psuModuleMap.equal_range(psu);
02929         for (it = ret.first; it != ret.second; ++it)
02930           {
02931            if((*it).second->HVchannel==3){outsHV3 <<(*it).second->idex << " "<< (*it).second->name<<" value= "<<(*it).second->value<<" <br>"<<std::endl;}
02932           }
02933         *txtfile  << "</pre><h4>"<< outsHV3.str()<<"</h4>"<<std::endl;
02934      }
02935    
02936     }
02937   }
02938   *txtfile << "</body></html>" << std::endl;
02939    txtfile->close();delete txtfile;
02940   }
02941  } 
02942  
02943 }
02944 void TrackerMap::printall(bool print_total, float minval, float maxval, std::string outputfilename){
02945 //Copy interface
02946   std::ofstream * ofilename;
02947   std::ifstream * ifilename;
02948   std::ostringstream ofname;
02949   std::string ifname;
02950   std::string line;
02951   std::string command;
02952 
02953   ifilename=findfile("viewerHeader.xhtml");
02954   ofname << outputfilename << "viewer.html";
02955   ofilename = new std::ofstream(ofname.str().c_str(),std::ios::out);
02956   while (getline( *ifilename, line )) { *ofilename << line << std::endl; }
02957 *ofilename <<"    var tmapname=\"" <<outputfilename << "\""<<std::endl;
02958 *ofilename <<"    var tmaptitle=\"" <<title << "\""<<std::endl;
02959 *ofilename <<"    var ncrates=" <<ncrates << ";"<<std::endl;
02960 *ofilename <<"    var nfeccrates=" <<nfeccrates << ";"<<std::endl;
02961 *ofilename <<"    var npsuracks=" <<npsuracks << ";"<<std::endl;
02962    ifilename->close();delete ifilename;
02963   ifilename=findfile("viewerTrailer.xhtml");
02964   while (getline( *ifilename, line )) { *ofilename << line << std::endl; }
02965    ofilename->close();delete ofilename;
02966    ifilename->close();delete ifilename;
02967    command = "sed -i \"s/XtmapnameX/"+outputfilename+"/g\" "+ ofname.str();
02968     std::cout << "Executing " << command << std::endl;
02969     system(command.c_str());
02970    command = "sed -i \"s/XtmaptitleX/"+title+"/g\" "+ ofname.str();
02971     std::cout << "Executing " << command << std::endl;
02972     system(command.c_str());
02973   ofname.str("");
02974   
02975 ifilename=findfile("jqviewer.js");
02976   ofname << "jqviewer.js";
02977   ofilename = new std::ofstream(ofname.str().c_str(),std::ios::out);
02978   while (getline( *ifilename, line )) { *ofilename << line << std::endl; }
02979    ofilename->close();delete ofilename;
02980    ifilename->close();delete ifilename;
02981  
02982   ofname.str("");
02983   ifilename=findfile("crate.js");
02984   ofname <<  "crate.js";
02985   ofilename = new std::ofstream(ofname.str().c_str(),std::ios::out);
02986   while (getline( *ifilename, line )) { *ofilename << line << std::endl; }
02987    ofilename->close();delete ofilename;
02988    ifilename->close();delete ifilename;
02989  
02990   ofname.str("");
02991   ifilename=findfile("feccrate.js");
02992   ofname <<  "feccrate.js";
02993   ofilename = new std::ofstream(ofname.str().c_str(),std::ios::out);
02994   while (getline( *ifilename, line )) { *ofilename << line << std::endl; }
02995    ofilename->close();delete ofilename;
02996    ifilename->close();delete ifilename;
02997  
02998   ofname.str("");
02999   ifilename=findfile("rack.js");
03000   ofname <<  "rack.js";
03001   ofilename = new std::ofstream(ofname.str().c_str(),std::ios::out);
03002   while (getline( *ifilename, line )) { *ofilename << line << std::endl; }
03003    ofilename->close();delete ofilename;
03004    ifilename->close();delete ifilename;
03005  
03006    ofname.str("");
03007   ifilename=findfile("rackhv.js");
03008   ofname <<  "rackhv.js";
03009   ofilename = new std::ofstream(ofname.str().c_str(),std::ios::out);
03010   while (getline( *ifilename, line )) { *ofilename << line << std::endl; }
03011    ofilename->close();delete ofilename;
03012    ifilename->close();delete ifilename;
03013    
03014    ofname.str("");
03015   ifilename=findfile("layer.js");
03016   ofname <<  "layer.js";
03017   ofilename = new std::ofstream(ofname.str().c_str(),std::ios::out);
03018   while (getline( *ifilename, line )) { *ofilename << line << std::endl; }
03019    ofilename->close();delete ofilename;
03020    ifilename->close();delete ifilename;
03021   
03022    command = "scp -r ../../DQM/TrackerCommon/test/jquery/ .";
03023     std::cout << "Executing " << command << std::endl;
03024     system(command.c_str());
03025    command = "scp -r ../../CommonTools/TrackerMap/data/images/ .";
03026     std::cout << "Executing " << command << std::endl;
03027     system(command.c_str());
03028  
03029   
03030     std::ostringstream outs;
03031     outs << outputfilename<<".png";
03032 save(true,minval,maxval,outs.str(),3000,1600);
03033 temporary_file=false;
03034 printlayers(true,minval,maxval,outputfilename);
03035 
03036 //Now print a text file for each layer 
03037   std::ofstream * txtfile;
03038 for (int layer=1; layer < 44; layer++){
03039   std::ostringstream outs;
03040     outs << outputfilename <<"layer"<<layer<< ".html";
03041     txtfile = new std::ofstream(outs.str().c_str(),std::ios::out);
03042     *txtfile << "<html><head></head> <body>" << std::endl;
03043     for (int ring=firstRing[layer-1]; ring < ntotRing[layer-1]+firstRing[layer-1];ring++){
03044       for (int module=1;module<200;module++) {
03045         int key=layer*100000+ring*1000+module;
03046         TmModule * mod = smoduleMap[key];
03047         if(mod !=0 && !mod->notInUse()){
03048             int idmod=mod->idex;
03049             int nchan=0;
03050             *txtfile  << "<a name="<<idmod<<"><pre>"<<std::endl;
03051              std::multimap<const int, TmApvPair*>::iterator pos;
03052              for (pos = apvModuleMap.lower_bound(idmod);
03053                 pos != apvModuleMap.upper_bound(idmod); ++pos) {
03054                TmApvPair* apvpair = pos->second;
03055                if(apvpair!=0){
03056                    nchan++;
03057                    *txtfile  <<  apvpair->text << std::endl;
03058                     }
03059 
03060                     }
03061                    *txtfile  << "</pre><h3>"<< mod->name<<"</h3>"<<std::endl;
03062                   }
03063                 }
03064                 }
03065     *txtfile << "</body></html>" << std::endl;
03066     txtfile->close();delete txtfile;
03067                 }
03068 if(enableFedProcessing){
03069   std::ostringstream outs1,outs2;
03070     outs1 << outputfilename<<"fed.png";
03071 save_as_fedtrackermap(true,0.,0.,outs1.str(),6000,3200);
03072     outs2 << outputfilename<<".xml";
03073 save_as_fedtrackermap(true,0.,0.,outs2.str(),3000,1600);
03074 //And a text file for each crate 
03075   std::map<int , int>::iterator i_fed;
03076   std::ofstream * txtfile;
03077   for (int crate=1; crate < (ncrates+1); crate++){
03078     std::ostringstream outs;
03079     outs << outputfilename <<"crate"<<crate<< ".html";
03080     txtfile = new std::ofstream(outs.str().c_str(),std::ios::out);
03081     *txtfile << "<html><head></head> <body>" << std::endl;
03082     for (i_fed=fedMap.begin();i_fed != fedMap.end(); i_fed++){
03083       if(i_fed->second == crate){
03084         int fedId = i_fed->first;
03085         for (int nconn=0;nconn<96;nconn++){
03086           int key = fedId*1000+nconn; 
03087           TmApvPair *  apvPair= apvMap[key];
03088           if(apvPair !=0){
03089             int idmod=apvPair->idex;
03090             *txtfile  << "<a name="<<idmod<<"><pre>"<<std::endl;
03091             *txtfile  <<  apvPair->text << std::endl;
03092             std::ostringstream outs;
03093             outs << "fedchannel "  <<apvPair->getFedId() << "/"<<apvPair->getFedCh()<<" connects to module  " << apvPair->mod->idex ;
03094             *txtfile  << "</pre><h3>"<< outs.str()<<"</h3>"<<std::endl;
03095              }
03096           }
03097       }
03098       }
03099     *txtfile << "</body></html>" << std::endl;
03100     txtfile->close();delete txtfile;
03101                 }
03102   }
03103 if(enableFecProcessing){
03104   std::ostringstream outs1,outs2;
03105     outs1 << outputfilename<<"fec.png";
03106 save_as_fectrackermap(true,0.,0.,outs1.str(),6000,3200);
03107     outs2 << outputfilename<<".xml";
03108 save_as_fectrackermap(true,0.,0.,outs2.str(),3000,1600);
03109 //And a text file for each crate
03110   std::ofstream * txtfile;
03111   std::map<int , TmCcu *>::iterator i_ccu;
03112   std::multimap<TmCcu*, TmModule*>::iterator it;
03113   std::pair<std::multimap<TmCcu*, TmModule*>::iterator,std::multimap<TmCcu*, TmModule*>::iterator> ret;
03114   for (int crate=1; crate < (nfeccrates+1); crate++){
03115     std::ostringstream outs;
03116     outs << outputfilename <<"feccrate"<<crate<< ".html";
03117     txtfile = new std::ofstream(outs.str().c_str(),std::ios::out);
03118     *txtfile << "<html><head></head> <body>" << std::endl;
03119     for( i_ccu=ccuMap.begin();i_ccu !=ccuMap.end(); i_ccu++){
03120      TmCcu *  ccu= i_ccu->second;
03121       if(ccu!=0&&ccu->getCcuCrate() == crate){
03122             int idmod=ccu->idex;
03123             *txtfile  << "<a name="<<idmod<<"><pre>"<<std::endl;
03124             *txtfile  <<  ccu->text << std::endl;
03125             std::ostringstream outs;
03126             if(ccu->nmod==0)outs << "ccu  is in position" << ccu->mpos<<"in ring but doesn't seem to have any module connected"; else
03127             {
03128             outs << "ccu  is in position " << ccu->mpos<<" in ring and connects  " <<ccu->nmod<< " modules" << std::endl;
03129             ret = fecModuleMap.equal_range(ccu);
03130         for (it = ret.first; it != ret.second; ++it)
03131           {
03132            outs << (*it).second->idex<<" " << (*it).second->name <<" value= "<< (*it).second->value<<"\n\n";
03133           }
03134 
03135             *txtfile  << "</pre><h4>"<< outs.str()<<"</h4>"<<std::endl;
03136           }//ifccu->nmod==0
03137       }//if ccu!=0
03138       }//for i_ccu
03139     *txtfile << "</body></html>" << std::endl;
03140     txtfile->close();
03141                 }//for int crate
03142   }
03143 if(enableLVProcessing){
03144   std::ostringstream outs3,outs4;
03145     outs3 << outputfilename<<"psu.png";
03146 save_as_psutrackermap(true,0.,0.,outs3.str(),6000,3200);
03147 
03148     outs4 << outputfilename<<".xml";
03149 save_as_psutrackermap(true,0.,0.,outs4.str(),3000,1600);
03150 //And a text file for each rack 
03151   
03152   std::ofstream * txtfile;
03153   std::map<int , TmPsu *>::iterator ipsu;
03154   std::multimap<TmPsu*, TmModule*>::iterator it;
03155   std::pair<std::multimap<TmPsu*, TmModule*>::iterator,std::multimap<TmPsu*, TmModule*>::iterator> ret;
03156   for (int rack=1; rack < (npsuracks+1); rack++){
03157     std::ostringstream outs;
03158     
03159     outs << outputfilename <<"psurack"<<rack<< ".html";
03160     txtfile = new std::ofstream(outs.str().c_str(),std::ios::out);
03161     *txtfile << "<html><head></head> <body>" << std::endl;
03162      for ( ipsu=psuMap.begin();ipsu !=psuMap.end(); ipsu++){
03163       TmPsu *  psu= ipsu->second;
03164       if(psu!=0 && psu->getPsuRack() == rack){
03165         *txtfile  << "<a name="<<psu->idex<<"><pre>"<<std::endl;      
03166         *txtfile  <<  psu->text << std::endl;
03167         std::ostringstream outs;
03168         if(psu->nmod==0)outs << "Ps is in position" << psu->getPsuBoard()<<"in crate but doesn't seem to have any module connected"; else
03169         {
03170         outs<< "PS is in position "  <<psu->getPsuBoard()<< " in crate and connects to "<<psu->nmod<<" modules. "<<std::endl;
03171         
03172         ret = psuModuleMap.equal_range(psu);
03173         for (it = ret.first; it != ret.second; ++it)
03174           {
03175            outs <<(*it).second->idex << " "<< (*it).second->name<<" value= "<<(*it).second->value<<" <br>"<<std::endl;
03176            
03177           }
03178         *txtfile  << "</pre><h4>"<< outs.str()<<"</h4>"<<std::endl;
03179      }
03180     }
03181   }
03182   *txtfile << "</body></html>" << std::endl;
03183    txtfile->close();
03184   }
03185  } 
03186 
03187 
03188 if(enableHVProcessing){
03189   std::ostringstream outs5,outs6;
03190     outs5 << outputfilename<<"hv.png";
03191 save_as_HVtrackermap(true,0.,0.,outs5.str(),6000,3200);
03192 
03193     outs6 << outputfilename<<".xml";
03194 save_as_HVtrackermap(true,0.,0.,outs6.str(),3000,1600);
03195 //And a text file for each rack 
03196 
03197   std::ofstream * txtfile;
03198   std::map<int , TmPsu *>::iterator ipsu;
03199   std::multimap<TmPsu*, TmModule*>::iterator it;
03200   std::pair<std::multimap<TmPsu*, TmModule*>::iterator,std::multimap<TmPsu*, TmModule*>::iterator> ret;
03201   for (int rack=1; rack < (npsuracks+1); rack++){
03202     std::ostringstream outs;
03203     
03204     outs << outputfilename <<"HVrack"<<rack<< ".html";
03205     txtfile = new std::ofstream(outs.str().c_str(),std::ios::out);
03206     *txtfile << "<html><head></head> <body>" << std::endl;
03207      for ( ipsu=psuMap.begin();ipsu !=psuMap.end(); ipsu++){
03208       TmPsu *  psu= ipsu->second;
03209       if(psu!=0 && psu->getPsuRack() == rack){
03210         *txtfile  << "<a name="<<psu->idex<<"><pre>"<<std::endl;      
03211         *txtfile  <<  psu->textHV2 << std::endl;
03212         std::ostringstream outsHV2;
03213         if(psu->nmodHV2==0)outsHV2 << "HV Channel002 is in position" << psu->getPsuBoard()<<"in crate but doesn't seem to have any module connected"; else
03214         {
03215         outsHV2<< "HV Channel002 is in position "  <<psu->getPsuBoard()<< " in crate and connects to "<<psu->nmodHV2<<" modules. "<<" <br>"<<std::endl;
03216         
03217         ret = psuModuleMap.equal_range(psu);
03218         for (it = ret.first; it != ret.second; ++it)
03219           {
03220            if((*it).second->HVchannel==2){outsHV2 <<(*it).second->idex << " "<< (*it).second->name<<" value= "<<(*it).second->value<<" <br>"<<std::endl;}
03221           }
03222         *txtfile  << "</pre><h4>"<< outsHV2.str()<<"</h4>"<<std::endl;
03223      }
03224     
03225         *txtfile  <<  psu->textHV3 << std::endl;
03226         std::ostringstream outsHV3;
03227         if(psu->nmodHV3==0)outsHV3 << "HV Channel003 is in position" << psu->getPsuBoard()<<"in crate but doesn't seem to have any module connected"; else
03228         {
03229         outsHV3<< "HV Channel003 is in position "  <<psu->getPsuBoard()<< " in crate and connects to "<<psu->nmodHV3<<" modules. "<<" <br>"<<std::endl;
03230         
03231         ret = psuModuleMap.equal_range(psu);
03232         for (it = ret.first; it != ret.second; ++it)
03233           {
03234            if((*it).second->HVchannel==3){outsHV3 <<(*it).second->idex << " "<< (*it).second->name<<" value= "<<(*it).second->value<<" <br>"<<std::endl;}
03235           }
03236         *txtfile  << "</pre><h4>"<< outsHV3.str()<<"</h4>"<<std::endl;
03237      }
03238    
03239     }
03240   }
03241   *txtfile << "</body></html>" << std::endl;
03242    txtfile->close();
03243   }
03244  } 
03245 
03246 
03247 }
03248 
03249 
03250 std::ifstream * TrackerMap::findfile(std::string filename) {
03251   std::ifstream * ifilename;
03252   std::string ifname;
03253   if(jsPath!=""){
03254   ifname=jsPath+filename;
03255   ifilename = new ifstream(edm::FileInPath(ifname).fullPath().c_str(),std::ios::in);
03256   if(!ifilename){
03257   ifname="CommonTools/TrackerMap/data/"+filename;
03258   ifilename = new ifstream(edm::FileInPath(ifname).fullPath().c_str(),std::ios::in);
03259   }
03260   }else {
03261   ifname="CommonTools/TrackerMap/data/"+filename;
03262   ifilename = new ifstream(edm::FileInPath(ifname).fullPath().c_str(),std::ios::in);
03263  }
03264   if(!ifilename)std::cout << "File " << filename << " missing" << std::endl;
03265   return ifilename;
03266  }
03267 void TrackerMap::printlayers(bool print_total, float minval, float maxval, std::string outputfilename){
03268   std::ofstream * xmlfile;
03269 saveAsSingleLayer=true;
03270 if(!print_total){
03271     for (int layer=1; layer < 44; layer++){
03272       for (int ring=firstRing[layer-1]; ring < ntotRing[layer-1]+firstRing[layer-1];ring++){
03273         for (int module=1;module<200;module++) {
03274           int key=layer*100000+ring*1000+module;
03275           TmModule * mod = smoduleMap[key];
03276           if(mod !=0 && !mod->notInUse()){
03277             mod->value = mod->value / mod->count;
03278           }
03279         }
03280       }
03281     }
03282   }
03283   if(minvalue>=maxvalue){
03284     minvalue=9999999.;
03285     maxvalue=-9999999.;
03286     for (int layer=1; layer < 44; layer++){
03287       for (int ring=firstRing[layer-1]; ring < ntotRing[layer-1]+firstRing[layer-1];ring++){
03288         for (int module=1;module<200;module++) {
03289           int key=layer*100000+ring*1000+module;
03290           TmModule * mod = smoduleMap[key];
03291           if(mod !=0 && !mod->notInUse()){
03292             if (minvalue > mod->value)minvalue=mod->value;
03293             if (maxvalue < mod->value)maxvalue=mod->value;
03294           }
03295         }
03296       }
03297     }
03298   }
03299 for (int layer=1; layer < 44; layer++){
03300   std::ostringstream outs;
03301     outs << outputfilename <<"layer"<<layer<< ".xml";
03302     xmlfile = new std::ofstream(outs.str().c_str(),std::ios::out);
03303     *xmlfile << "<?xml version=\"1.0\" standalone=\"no\"?>"<<std::endl;
03304     *xmlfile << "<svg xmlns=\"https://www.w3.org/2000/svg\""<<std::endl;
03305     *xmlfile << "xmlns:svg=\"https://www.w3.org/2000/svg\""<<std::endl;
03306     *xmlfile << "xmlns:xlink=\"https://www.w3.org/1999/xlink\" >"<<std::endl;
03307     *xmlfile << "<script type=\"text/ecmascript\" xlink:href=\"layer.js\" />"<<std::endl;
03308     *xmlfile << "<svg id=\"mainMap\" x=\"0\" y=\"0\" viewBox=\"0 0  500 500\" width=\"700\" height=\"700\" onload=\"TrackerLayer.init()\">"<<std::endl;
03309     if(layer<31)*xmlfile << "<g id=\"layer\" transform=\" translate(0,400) rotate(270) scale(1.,1.)\"  > "<<std::endl;
03310     else *xmlfile << "<g id=\"layer\" transform=\" translate(0,400) rotate(270) scale(1.,0.8)\"  > "<<std::endl;
03311     *xmlfile << "<rect fill=\"lightblue\" stroke=\"none\" x=\"0\" y=\"0\" width=\"700\" height=\"700\" />"<<std::endl;
03312     *xmlfile << "<svg:polygon id=\"fed\" mapAttribute=\"fed\" points=\"250,40 250,10 230,10 230,40\" onclick=\"chooseMap(evt);\" onmouseover=\"chooseMap(evt);\" onmouseout=\"chooseMap(evt);\" fill=\"rgb(0,127,255)\"/>"<<std::endl;
03313     *xmlfile << "<svg:polygon id=\"fec\" mapAttribute=\"fec\" points=\"228,40 228,10 208,10 208,40\" onclick=\"chooseMap(evt);\" onmouseover=\"chooseMap(evt);\" onmouseout=\"chooseMap(evt);\" fill=\"rgb(0,127,255)\"/>"<<std::endl;
03314     *xmlfile << "<svg:polygon id=\"lv\" mapAttribute=\"lv\" points=\"206,40 206,10 186,10 186,40\" onclick=\"chooseMap(evt);\" onmouseover=\"chooseMap(evt);\" onmouseout=\"chooseMap(evt);\" fill=\"rgb(0,127,255)\"/>"<<std::endl;
03315     *xmlfile << "<svg:polygon id=\"hv\" mapAttribute=\"hv\" points=\"184,40 184,10 164,10 164,40\" onclick=\"chooseMap(evt);\" onmouseover=\"chooseMap(evt);\" onmouseout=\"chooseMap(evt);\" fill=\"rgb(0,127,255)\"/>"<<std::endl;
03316     *xmlfile << "<svg:polygon id=\"plot\" mapAttribute=\"plot\" points=\"155,45 155,5 135,5 135,45\" onclick=\"chooseMap(evt);\" onmouseover=\"chooseMap(evt);\" onmouseout=\"chooseMap(evt);\" fill=\"rgb(200,0,0)\"/>"<<std::endl;
03317   
03318     nlay=layer;
03319     defwindow(nlay);
03320     for (int ring=firstRing[layer-1]; ring < ntotRing[layer-1]+firstRing[layer-1];ring++){
03321       for (int module=1;module<200;module++) {
03322         int key=layer*100000+ring*1000+module;
03323         TmModule * mod = smoduleMap[key];
03324         if(mod !=0 && !mod->notInUse()){
03325           drawModule(mod,key,layer,print_total,xmlfile);
03326         }
03327       }
03328     }
03329     *xmlfile << "</g> </svg> <text id=\"currentElementText\" x=\"40\" y=\"30\">" << std::endl;
03330     *xmlfile << "<tspan id=\"line1\" x=\"40\" y=\"30\"> </tspan> " << std::endl;
03331     *xmlfile << "<tspan id=\"line2\" x=\"40\" y=\"60\"> </tspan> " << std::endl;
03332     *xmlfile << "<tspan id=\"line3\" x=\"40\" y=\"90\"> </tspan> " << std::endl;
03333     *xmlfile << "<tspan id=\"line4\" x=\"40\" y=\"120\"> </tspan> " << std::endl;
03334     if(layer > 33){
03335     *xmlfile << "<tspan  mapAttribute=\"fed\" onclick=\"chooseMap(evt);\" onmouseover=\"chooseMap(evt);\" onmouseout=\"chooseMap(evt);\" x=\"15\" y=\"228\" font-size=\"12\" font-family=\"arial\" fill=\"white\">FED</tspan> " <<std::endl;
03336     *xmlfile << "<tspan  mapAttribute=\"fec\" onclick=\"chooseMap(evt);\" onmouseover=\"chooseMap(evt);\" onmouseout=\"chooseMap(evt);\" x=\"15\" y=\"258\" font-size=\"12\" font-family=\"arial\" fill=\"white\">FEC</tspan> " <<std::endl;
03337     *xmlfile << "<tspan  mapAttribute=\"lv\" onclick=\"chooseMap(evt);\" onmouseover=\"chooseMap(evt);\" onmouseout=\"chooseMap(evt);\" x=\"18\" y=\"289\" font-size=\"12\" font-family=\"arial\" fill=\"white\">LV</tspan> " <<std::endl;
03338     *xmlfile << "<tspan  mapAttribute=\"hv\" onclick=\"chooseMap(evt);\" onmouseover=\"chooseMap(evt);\" onmouseout=\"chooseMap(evt);\" x=\"18\" y=\"319\" font-size=\"12\" font-family=\"arial\" fill=\"white\">HV</tspan> " <<std::endl;
03339     *xmlfile << "<tspan  mapAttribute=\"plot\" onclick=\"chooseMap(evt);\" onmouseover=\"chooseMap(evt);\" onmouseout=\"chooseMap(evt);\" x=\"12\" y=\"360\" font-size=\"12\" font-family=\"arial\" fill=\"white\">PLOT</tspan> " <<std::endl;
03340     }
03341     else{
03342     *xmlfile << "<tspan   mapAttribute=\"fed\" onclick=\"chooseMap(evt);\" onmouseover=\"chooseMap(evt);\" onmouseout=\"chooseMap(evt);\" x=\"21\" y=\"228\" font-size=\"12\" font-family=\"arial\" fill=\"white\">FED</tspan> " <<std::endl;
03343     *xmlfile << "<tspan   mapAttribute=\"fec\" onclick=\"chooseMap(evt);\" onmouseover=\"chooseMap(evt);\" onmouseout=\"chooseMap(evt);\" x=\"21\" y=\"258\" font-size=\"12\" font-family=\"arial\" fill=\"white\">FEC</tspan> " <<std::endl;
03344     *xmlfile << "<tspan   mapAttribute=\"lv\" onclick=\"chooseMap(evt);\" onmouseover=\"chooseMap(evt);\" onmouseout=\"chooseMap(evt);\" x=\"24\" y=\"289\" font-size=\"12\" font-family=\"arial\" fill=\"white\">LV</tspan> " <<std::endl;
03345     *xmlfile << "<tspan   mapAttribute=\"hv\" onclick=\"chooseMap(evt);\" onmouseover=\"chooseMap(evt);\" onmouseout=\"chooseMap(evt);\" x=\"24\" y=\"319\" font-size=\"12\" font-family=\"arial\" fill=\"white\">HV</tspan> " <<std::endl;
03346     *xmlfile << "<tspan   mapAttribute=\"plot\" onclick=\"chooseMap(evt);\" onmouseover=\"chooseMap(evt);\" onmouseout=\"chooseMap(evt);\" x=\"17\" y=\"360\" font-size=\"12\" font-family=\"arial\" fill=\"white\">PLOT</tspan> " <<std::endl;
03347     }
03348     *xmlfile << " </text> </svg>" << std::endl;
03349     xmlfile->close();delete xmlfile;
03350   }
03351 saveAsSingleLayer=false;
03352 }