00001 #include "CalRecon/CalCalibLogs.h"
00002
00003 #include <fstream>
00004 #include "xml/IFile.h"
00005
00006 CalCalibLog::CalCalibLog(int ilayer, int iview, int icolumn)
00007 :CalLogID(ilayer,iview,icolumn){}
00008
00009
00010 CalCalibLog* CalCalibLogs::getLogID(int logID) const
00011
00012 {
00013 int jlog = -1;
00014 for (int ilog = 0; ilog < m_List.size(); ilog++) {
00015 if (m_List[ilog]->logID() == logID) {
00016 jlog = ilog;
00017 break;
00018 }
00019 }
00020 return m_List[jlog];
00021 }
00022
00023 void CalCalibLogs::ini(int nLogs, int nLayers)
00024 {
00025
00026 for (int ilayer = 0; ilayer < nLayers; ilayer++) {
00027 for (int ilog = 0; ilog < nLogs; ilog++) {
00028 m_List.push_back(new CalCalibLog(ilayer,CalDetGeo::X,ilog));
00029 m_List.push_back(new CalCalibLog(ilayer,CalDetGeo::Y,ilog));
00030 }
00031 }
00032
00033 m_GainFile = "";
00034 m_IntlinFile = "";
00035 m_RailFile = "";
00036 m_SlopeFile = "";
00037 }
00038
00039
00040 CalCalibLogs::~CalCalibLogs()
00041
00042 {
00043 for (int ilog = 0; ilog < m_List.size(); ilog++) delete m_List[ilog];
00044 }
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058 void CalCalibLogs::make()
00059 {
00060 readGain();
00061 readSlope();
00062 readIntlin();
00063 readRail();
00064 }
00065 void CalCalibLogs::readIntlin()
00066 {
00067 xml::IFile::extractEnvVar(&m_IntlinFile);
00068 std::cout << " Calorimeter linearity file : "+m_IntlinFile << std::endl;
00069 if (m_IntlinFile == "") return;
00070
00071 std::ifstream file;
00072 file.open(m_IntlinFile.c_str());
00073 while(file.good()){
00074 int range;
00075 int side;
00076 int col;
00077 int layer;
00078
00079 file >> range;
00080 file >> side;
00081 file >> col;
00082 file >> layer;
00083 if(!file.good())break;
00084
00085 int view = 1 - layer%2; layer /= 2;
00086 side = 1-side; layer = 3-layer;
00087
00088 CalCalibLog* log =
00089 getLogID(CalLogID::ID(layer,CalDetGeo::makeAxis(view),col));
00090 log->readIntlin(file,side,range);
00091 }
00092 file.close();
00093 }
00094
00095 void CalCalibLogs::readGain()
00096 {
00097 xml::IFile::extractEnvVar(&m_GainFile);
00098 std::cout << " Calorimeter gain file : "+m_GainFile << std::endl;
00099 if (m_GainFile == "") return;
00100
00101 std::ifstream file;
00102 file.open(m_GainFile.c_str());
00103 while(file.good()){
00104 int side;
00105 int col;
00106 int layer;
00107
00108 file >> side;
00109 file >> col;
00110 file >> layer;
00111 if(!file.good())break;
00112
00113 int view = 1 - layer%2; layer /= 2;
00114 side = 1-side; layer = 3-layer;
00115
00116 CalCalibLog* log =
00117 getLogID(CalLogID::ID(layer,CalDetGeo::makeAxis(view),col));
00118 log->readGain(file,side);
00119 }
00120 file.close();
00121 }
00122 void CalCalibLogs::readRail()
00123 {
00124 xml::IFile::extractEnvVar(&m_RailFile);
00125 std::cout << " Calorimeter rails file : "+m_RailFile << std::endl;
00126 if (m_RailFile == "") return;
00127
00128 std::ifstream file;
00129 file.open(m_RailFile.c_str());
00130 while(file.good()){
00131 int side;
00132 int col;
00133 int layer;
00134
00135 file >> side;
00136 file >> col;
00137 file >> layer;
00138 if(!file.good())break;
00139
00140 int view =1-layer%2; layer /= 2;
00141 side = 1-side; layer = 3-layer;
00142
00143 CalCalibLog* log =
00144 getLogID(CalLogID::ID(layer,CalDetGeo::makeAxis(view),col));
00145 log->readRail(file,side);
00146 }
00147 file.close();
00148 }
00149 void CalCalibLogs::readSlope()
00150 {
00151 xml::IFile::extractEnvVar(&m_SlopeFile);
00152 std::cout << " Calorimeter light asymmetry file : "+m_SlopeFile << std::endl;
00153 if (m_SlopeFile == "") return;
00154
00155 std::ifstream file;
00156 file.open(m_SlopeFile.c_str());
00157 while(file.good()){
00158 int col;
00159 int layer;
00160
00161 file >> col;
00162 file >> layer;
00163 if(!file.good())break;
00164 int view = 1-layer%2; layer /= 2;
00165 layer = 3-layer;
00166
00167 CalCalibLog* log =
00168 getLogID(CalLogID::ID(layer,CalDetGeo::makeAxis(view),col));
00169 log->readSlope(file);
00170 }
00171 file.close();
00172 }
00173 void CalCalibLog::readIntlin(std::istream& file, int side, int range)
00174 {
00175 file >> m_brkpt[side][range];
00176 int i = 0;
00177 for ( ;i<3;i++) file >> m_coefa[i][side][range] ;
00178 for (i=0;i<3;i++) file >> m_coefb[i][side][range] ;
00179 }
00180
00181 void CalCalibLog::readGain(std::istream& file, int side)
00182 { const double g[4] = {2.1, 2.1, 8.4, 8.4};
00183 double gain;
00184 for ( int i=0;i<CALNRANGES;i++){ file >>gain;
00185 m_gain[side][i] = gain>0? gain : g[i];
00186 }
00187 }
00188
00189 void CalCalibLog::readRail(std::istream& file, int side)
00190 {
00191 for ( int i=0;i<CALNRANGES;i++) file >> m_rail[side][i];
00192 }
00193
00194 void CalCalibLog::readSlope(std::istream& file)
00195 {
00196 for ( int i=0;i<CALNRANGES;i++) file >> m_slope[i];
00197 }
00198
00199 double CalCalibLog::adc_to_MeV(double adc, int s, int r) const
00200 {
00201 double a[3];
00202 double bp = getBrkpt(s,r);
00203 for( int i = 0; i<3; i++)
00204 a[i] = adc<bp ? getCoefa(i,s,r):getCoefb(i,s,r);
00205 return (a[0]+(a[1]+a[2]*adc)*adc)*getGain(s,r);
00206 }