00001 #include "AtlfastAlgs/EPileupMap.h" 00002 #include "AtlfastEvent/EPileupDeposit.h" 00003 #include "AtlfastUtils/NumberToString.h" 00004 #include <iostream> 00005 #include <fstream> 00006 namespace Atlfast{ 00007 00009 EPileupMap::EPileupMap(int luminosity){ 00010 m_emPileupMap = new vector<EPileupDeposit*>; 00011 m_hadPileupMap = new vector<EPileupDeposit*>; 00012 00015 if (luminosity == 1){ 00016 m_nFiles = 10401; 00017 m_fileDir = "allfiles_ll/"; 00018 }else if (luminosity == 2){ 00019 m_nFiles = 10830; 00020 m_fileDir = "allfiles_hl/"; 00021 } 00023 this->makeCellMap(); 00024 } 00026 EPileupMap::~EPileupMap(){ 00027 this->emptyMap(); 00028 delete m_emPileupMap; 00029 delete m_hadPileupMap; 00030 delete m_phiMap; 00031 delete m_etaMap; 00032 } 00033 00034 00035 void EPileupMap::fillMap(){ 00037 this->emptyMap(); 00039 this->setInputFile(); 00040 00041 ifstream input; 00043 input.open( m_pileupFile.c_str()); 00044 if (input) { 00045 int code; 00046 double energy; 00047 while (input >> code && input >> energy){ 00048 if (code > 0){ 00049 std::string type; 00051 int intType = code/100000; 00053 int eta = (code - intType*100000)/100; 00054 int phi = code - intType*100000 - eta*100; 00056 double et = energy/1000.0; 00057 00058 if(intType == 1){ 00060 m_emPileupMap->push_back(new EPileupDeposit((m_etaMap->find(eta))->second,(m_phiMap->find(phi))->second,et)); 00061 } 00062 if(intType == 2){ 00064 m_hadPileupMap->push_back(new EPileupDeposit((m_etaMap->find(eta))->second,(m_phiMap->find(phi))->second,et)); 00065 } 00066 00067 } 00068 00069 } 00070 }else{ 00071 std::cout << "ERROR! COULD NOT OPEN EPILEUP FILE " << m_pileupFile << std::endl; 00072 } 00073 return; 00074 } 00076 void EPileupMap::emptyMap(){ 00077 if (m_emPileupMap->size()){ 00078 std::vector<EPileupDeposit*>::iterator itr=m_emPileupMap->begin(); 00079 for (; itr != m_emPileupMap->end();++itr){ 00080 delete (*itr); 00081 } 00082 m_emPileupMap->clear(); 00083 } 00084 if (m_hadPileupMap->size()){ 00085 std::vector<EPileupDeposit*>::iterator itr=m_hadPileupMap->begin(); 00086 for (; itr != m_hadPileupMap->end();++itr){ 00087 delete (*itr); 00088 } 00089 m_hadPileupMap->clear(); 00090 } 00091 return; 00092 } 00094 void EPileupMap::makeCellMap(){ 00095 m_phiMap = new std::map<int,double> ; 00096 m_etaMap = new std::map<int,double> ; 00100 int EtaCells = 100; 00101 double EtaRange = 10; 00102 int PhiCells = 64; 00103 double PhiRange = 2*3.1415; 00104 for (int i = 1 ; i <= EtaCells; ++i){ 00105 m_etaMap->insert(pair<int,double>(i,((((i)-(EtaCells/2))/(EtaCells/EtaRange)) - (EtaRange/(EtaCells*2.0))))); 00106 } 00107 for (int i = 1 ; i <= PhiCells; ++i){ 00108 m_phiMap->insert(pair<int,double>(i,((((i)-(PhiCells/2))/(PhiCells/PhiRange)) - (PhiRange/(PhiCells*2.0))))) ; 00109 } 00110 return; 00111 } 00112 00113 00115 void EPileupMap::setInputFile(){ 00116 double max = RAND_MAX; 00117 int i = (int)(rand()/max*m_nFiles); 00118 if(i < 10){ 00119 m_pileupFile = m_fileDir + "part0000" + numberToString(i); 00120 } else if(i < 100){ 00121 m_pileupFile = m_fileDir + "part000" + numberToString(i); 00122 } else if(i < 1000){ 00123 m_pileupFile = m_fileDir + "part00" + numberToString(i); 00124 } else if(i < 10000){ 00125 m_pileupFile = m_fileDir + "part0" + numberToString(i); 00126 } else { 00127 m_pileupFile = m_fileDir + "part" + numberToString(i); 00128 } 00129 return; 00130 } 00131 00132 }