00001
00002 #include "mEmcMIPCorr3Module.h"
00003 #include "EmcStaticData.h"
00004 #include "EmcSector.h"
00005
00006 #include "emcDataManager.h"
00007 #include "EmcIndexer.h"
00008 #include "emcGains.h"
00009 #include "emcDBMS.h"
00010 #include "EmcSimuRawDataReCal.h"
00011
00012 #include "dEmcRawDataWrapper.h"
00013 #include "EmcEnergyAfterBurnerv1.h"
00014
00015
00016 #include "PHIODataNode.h"
00017
00018
00019
00020 #include <iostream>
00021
00022
00023 using namespace std;
00024
00025 typedef PHIODataNode<dEmcRawDataWrapper> dEmcRawDataNode_t;
00026
00027
00028 EmcSimuRawDataReCal::EmcSimuRawDataReCal()
00029 {
00030 final_gain = new float[NTOWER];
00031 db_gain = new float[NTOWER];
00032 mip_gain = new float[NTOWER];
00033 burner_gain = new float[NTOWER];
00034
00035 pedestal = new float[NTOWER];
00036
00037 emcEnergyaftb = new EmcEnergyAfterBurnerv1();
00038 }
00039
00040 EmcSimuRawDataReCal::~EmcSimuRawDataReCal()
00041 {
00042 delete [] final_gain;
00043 delete [] db_gain;
00044 delete [] mip_gain;
00045 delete [] burner_gain;
00046 delete [] pedestal;
00047
00048 delete emcEnergyaftb;
00049 }
00050
00051 void EmcSimuRawDataReCal::Reset()
00052 {
00053 for(int i = 0; i<NTOWER; i++) {
00054 final_gain[i] = 1;
00055 db_gain[i] = 1;
00056 mip_gain[i] = 1;
00057 burner_gain[i] = 1;
00058 pedestal[i] = 0;
00059 }
00060 }
00061
00062 void EmcSimuRawDataReCal::SetCalibConst(int runNumber)
00063 {
00064
00065 cout << "EmcSimuRawDataRecal: Run number is: " << runNumber << endl;
00066
00067 Reset();
00068
00069 if(runNumber>0) {
00070 SetGainFromDB();
00071 SetGainFromMIP(runNumber);
00072 SetGainFromAfterBurner(runNumber);
00073
00074 for(int i = 0; i<NTOWER; i++)
00075 {
00076 final_gain[i] = db_gain[i]*mip_gain[i]*burner_gain[i];
00077 }
00078 }
00079 }
00080
00081 void EmcSimuRawDataReCal::SetGainFromDB()
00082 {
00083 for(int itower = 0; itower <NTOWER; itower++) {
00084 db_gain[itower] = GetGainFactorFromDB(itower);
00085 }
00086 }
00087
00088 float EmcSimuRawDataReCal::GetGainFactorFromDB(int twrId)
00089 {
00090 static emcGains gains[172];
00091 static bool eCalLoaded = false;
00092 static bool gOK[172];
00093
00094 EmcStaticData * sd = EmcStaticData::buildEmcStaticData() ;
00095 EmcSector * sector ;
00096 int iS, iST, iCh;
00097 float encal, norm0, nothing, normt ;
00098 float c0,g0,cf ;
00099 float kappa = 1.0/5.9950 ;
00100 int absPosition;
00101
00102 if(!eCalLoaded) {
00103 PHTimeStamp when;
00104 when.setToSystemTime();
00105 for (iS=0;iS<8;iS++){
00106 sector = sd->getSector(iS) ;
00107 if( !sector ) {
00108
00109
00110
00111 sd ->buildEmcSector( EmcIndexer::EmcSectorId(iS), & when) ;
00112 sector = sd->getSector(iS) ;
00113 }
00114 }
00115 emcDataManager * dm = emcDataManager::GetInstance();
00116 for (absPosition=0;absPosition<172;absPosition++){
00117 int code = emcCalFEM::FEMCode(absPosition,0,0,0);
00118 gains[absPosition].SetSource(emcDBMS::get());
00119
00120 gOK[absPosition] = dm->Read(gains[absPosition], when, code);
00121
00122 }
00123 eCalLoaded = true;
00124 }
00125 EmcIndexer::PXPXSM144CH(twrId, absPosition, iCh) ;
00126 if(!gOK[absPosition]) return 1;
00127 normt = gains[absPosition].getValue(iCh,0);
00128 if(normt==0.) return 1;
00129 EmcIndexer::iPXiSiST(twrId, iS, iST) ;
00130 sector = sd->getSector(iS) ;
00131 if ( iS < 6 ) {
00132 sector->GetEnergyCalibration(iST,encal,norm0,nothing) ;
00133 } else {
00134 sector->GetEnergyCalibration(iST,c0,g0,cf) ;
00135 encal = c0*g0*cf ;
00136 norm0 = kappa ;
00137 }
00138
00139 return encal*norm0/normt;
00140
00141 }
00142
00143 void EmcSimuRawDataReCal::SetGainFromMIP(int run)
00144 {
00145 mEmcMIPCorr3Module* mEmcMIPCorr3 = mEmcMIPCorr3Module::instance();
00146
00147 int arm, sect, iy, iz;
00148 for(int itower = 0; itower <NTOWER; itower++) {
00149 EmcIndexer::TowerLocation(itower, arm, sect, iy, iz);
00150 mip_gain[itower] = mEmcMIPCorr3->get_corr_twr_mip(arm, sect, iz, iy)*
00151 mEmcMIPCorr3->get_corr_run(arm, sect, run);
00152 }
00153 }
00154
00155 void EmcSimuRawDataReCal::SetGainFromAfterBurner(int runNumber)
00156 {
00157 emcEnergyaftb->initialize(runNumber);
00158 int arm, sect, iy, iz;
00159 for(int itower = 0; itower <NTOWER; itower++) {
00160 EmcIndexer::TowerLocation(itower, arm, sect, iy, iz);
00161 burner_gain[itower] = emcEnergyaftb->get_tower_scalefactor(arm, sect, iy, iz);
00162 }
00163 }
00164
00165 PHBoolean EmcSimuRawDataReCal::event(PHCompositeNode* root)
00166 {
00167 int dbg=0;
00168
00169 if(dbg)
00170 cout << "EmcSimuRawDataReCal:" << endl;
00171
00172 PHNodeIterator iter(root);
00173 dEmcRawDataWrapper* dEmcRawDataReCal = 0;
00174 dEmcRawDataNode_t *uncalnode = static_cast<dEmcRawDataNode_t *>(iter.findFirst("PHIODataNode","dEmcRawDataReCal"));
00175 if(uncalnode) {
00176 dEmcRawDataReCal = uncalnode->getData();
00177 } else {
00178 cout<<" EmcSimuRawDataReCal: could not find table dEmcRawDataReCal"<<endl;
00179 return 0;
00180 }
00181
00182 dEmcRawDataWrapper* dEmcRawData = 0;
00183 dEmcRawDataNode_t *rawnode = static_cast<dEmcRawDataNode_t *>(iter.findFirst("PHIODataNode","dEmcRawData"));
00184 if(rawnode) {
00185 dEmcRawData = rawnode->getData();
00186 } else {
00187 cout<<" EmcSimuRawDataReCal: could not find table dEmcRawData"<<endl;
00188 return 0;
00189 }
00190
00191
00192 for( size_t iraw = 0; iraw<dEmcRawData->RowCount(); iraw++) {
00193 dEmcRawDataReCal->set_id(iraw, dEmcRawData->get_id(iraw));
00194 dEmcRawDataReCal->set_evno(iraw, dEmcRawData->get_evno(iraw));
00195 dEmcRawDataReCal->set_hwkey(iraw, dEmcRawData->get_hwkey(iraw));
00196 dEmcRawDataReCal->set_swkey(iraw, dEmcRawData->get_swkey(iraw));
00197 dEmcRawDataReCal->set_type(iraw, dEmcRawData->get_type(iraw));
00198 dEmcRawDataReCal->set_tdc(iraw, dEmcRawData->get_tdc(iraw));
00199
00200 int towerkey = dEmcRawData->get_swkey(iraw);
00201
00202 int towerID = getTowerID(towerkey);
00203
00204
00205
00206 float tmp_lpre = (float)dEmcRawData->get_adclopre(iraw);
00207 float tmp_hpre = (float)dEmcRawData->get_adchipre(iraw);
00208
00209
00210
00211
00212
00213
00214
00215 float hi_energy = (float) (dEmcRawData->get_adchipost(iraw)-
00216 dEmcRawData->get_adchipre(iraw)) * (0.008);
00217
00218
00219
00220
00221
00222 hi_energy = hi_energy/16;
00223
00224
00225
00226 float tmp_hpost = (hi_energy/final_gain[towerID] +
00227 dEmcRawData->get_adchipre(iraw)) + pedestal[towerID];
00228
00229
00230
00231 float lo_energy = (float) (dEmcRawData->get_adclopost(iraw)-
00232 dEmcRawData->get_adclopre(iraw)) * 0.001;
00233
00234
00235
00236 float tmp_lpost = (lo_energy/final_gain[towerID] +
00237 dEmcRawData->get_adclopre(iraw)) + pedestal[towerID];
00238
00239
00240
00241
00242
00243 dEmcRawDataReCal->set_adclopre(iraw, (short) tmp_lpre);
00244 if(tmp_lpost<0)
00245 {
00246 if(dbg)
00247 cout << " -------- adclopost changed from " << tmp_lpost;
00248
00249 tmp_lpost = 100;
00250
00251 if(dbg)
00252 cout << " to " << tmp_lpost << " to force Lvl2 to use high" << endl;
00253 }
00254 dEmcRawDataReCal->set_adclopost(iraw, (short) tmp_lpost);
00255 dEmcRawDataReCal->set_adchipre(iraw, (short) tmp_hpre);
00256 dEmcRawDataReCal->set_adchipost(iraw, (short) tmp_hpost);
00257
00258 if(dbg)
00259 {
00260 int net_counts = - (dEmcRawDataReCal->get_adclopost(iraw) -
00261 dEmcRawDataReCal->get_adclopre(iraw));
00262 if(net_counts>3071)
00263 net_counts = -16 * (dEmcRawDataReCal->get_adchipost(iraw) -
00264 dEmcRawDataReCal->get_adchipre(iraw));
00265
00266 cout << " **** towerID " << towerID
00267 << " final_gain " << final_gain[towerID]
00268 << " input energy = " << -1 * lo_energy
00269 << " corrected net counts " << net_counts
00270 << endl;
00271 }
00272
00273 }
00274
00275 dEmcRawDataReCal->SetRowCount(dEmcRawData->RowCount());
00276
00277 return True;
00278 }
00279
00280
00281 int EmcSimuRawDataReCal::getTowerID(int towerkey)
00282 {
00283 int iS;
00284
00285 int iz=towerkey%100;
00286 towerkey/=100;
00287 int iy=towerkey%100;
00288 towerkey/=100;
00289 int sector=towerkey%10;
00290 towerkey/=10;
00291 int arm=towerkey;
00292
00293 if(arm==1) {
00294 iS = sector + 6;
00295 if(iS>=8) iS -=4;
00296 } else {
00297 iS = sector;
00298 }
00299 int towerID = EmcIndexer::getTowerId(iS, iz, iy);
00300 return towerID;
00301 }