00001 #include "AtlfastAlgs/EPileupMap.h"
00002 #include "AtlfastEvent/EPileupDeposit.h"
00003 #include "AtlfastUtils/NumberToString.h"
00004 #include <iostream>
00005 #include <fstream>
00006
00007 #include "CLHEP/Units/SystemOfUnits.h"
00008 #include "PathResolver/PathResolver.h"
00009
00010 namespace Atlfast{
00011
00013 EPileupMap::EPileupMap(int luminosity){
00014 m_emPileupMap = new std::vector<EPileupDeposit*>;
00015 m_hadPileupMap = new std::vector<EPileupDeposit*>;
00016
00019 if (luminosity == 1){
00020 m_nFiles = 10401;
00021 m_fileDir = "allfiles_ll/";
00022 }else if (luminosity == 2){
00023 m_nFiles = 10830;
00024 m_fileDir = "allfiles_hl/";
00025 }
00027 this->makeCellMap();
00028 }
00030 EPileupMap::~EPileupMap(){
00031 this->emptyMap();
00032 delete m_emPileupMap;
00033 delete m_hadPileupMap;
00034 delete m_phiMap;
00035 delete m_etaMap;
00036 }
00037
00038
00039 void EPileupMap::fillMap(){
00041 this->emptyMap();
00043 this->setInputFile();
00044
00045 std::ifstream input;
00047 input.open( m_pileupFile.c_str());
00048 if (input) {
00049 int code;
00050 double energy;
00051 while (input >> code && input >> energy){
00052 if (code > 0){
00053 std::string type;
00055 int intType = code/100000;
00057 int eta = (code - intType*100000)/100;
00058 int phi = code - intType*100000 - eta*100;
00060 double et = energy*GeV;
00061
00062 if(intType == 1){
00064 m_emPileupMap->
00065 push_back(
00066 new EPileupDeposit(
00067 (m_etaMap->find(eta))->second,
00068 (m_phiMap->find(phi))->second,
00069 et)
00070 );
00071 }
00072
00073 if(intType == 2){
00075 m_hadPileupMap->
00076 push_back(
00077 new EPileupDeposit(
00078 (m_etaMap->find(eta))->second,
00079 (m_phiMap->find(phi))->second,
00080 et
00081 )
00082 );
00083 }
00084
00085 }
00086
00087 }
00088 }else{
00089 std::cout << "ERROR! COULD NOT OPEN EPILEUP FILE "
00090 << m_pileupFile << std::endl;
00091 }
00092 return;
00093 }
00095 void EPileupMap::emptyMap(){
00096 if (m_emPileupMap->size()){
00097 std::vector<EPileupDeposit*>::iterator itr=m_emPileupMap->begin();
00098 for (; itr != m_emPileupMap->end();++itr){
00099 delete (*itr);
00100 }
00101 m_emPileupMap->clear();
00102 }
00103 if (m_hadPileupMap->size()){
00104 std::vector<EPileupDeposit*>::iterator itr=m_hadPileupMap->begin();
00105 for (; itr != m_hadPileupMap->end();++itr){
00106 delete (*itr);
00107 }
00108 m_hadPileupMap->clear();
00109 }
00110 return;
00111 }
00113 void EPileupMap::makeCellMap(){
00114 m_phiMap = new std::map<int,double> ;
00115 m_etaMap = new std::map<int,double> ;
00119 int EtaCells = 100;
00120 double EtaRange = 10;
00121 int PhiCells = 64;
00122 double PhiRange = 2*3.1415;
00123 for (int i = 1 ; i <= EtaCells; ++i){
00124 m_etaMap->
00125 insert(std::pair<int,double>(i,
00126 (i-(EtaCells/2))/(EtaCells/EtaRange)-
00127 EtaRange/(EtaCells*2.0)
00128 )
00129 );
00130 }
00131 for (int i = 1 ; i <= PhiCells; ++i){
00132 m_phiMap->
00133 insert(std::pair<int,double>(i,
00134 (i-(PhiCells/2))/(PhiCells/PhiRange)-
00135 PhiRange/(PhiCells*2.0)
00136 )
00137 ) ;
00138 }
00139 return;
00140 }
00141
00142
00144 void EPileupMap::setInputFile(){
00145 double max = RAND_MAX;
00146 int i = (int)(rand()/max*m_nFiles);
00147 if(i < 10){
00148 m_pileupFile = m_fileDir + "part0000" + numberToString(i);
00149 } else if(i < 100){
00150 m_pileupFile = m_fileDir + "part000" + numberToString(i);
00151 } else if(i < 1000){
00152 m_pileupFile = m_fileDir + "part00" + numberToString(i);
00153 } else if(i < 10000){
00154 m_pileupFile = m_fileDir + "part0" + numberToString(i);
00155 } else {
00156 m_pileupFile = m_fileDir + "part" + numberToString(i);
00157 }
00158
00159 m_pileupFile = PathResolver::find_file(m_pileupFile, "DATAPATH");
00160
00161 return;
00162 }
00163
00164 }