EmcSimuRawDataReCal.C

Go to the documentation of this file.
00001 //INCLUDECHECKER: Removed this line: #include "emcCalibratorFactory.h"
00002 #include "mEmcMIPCorr3Module.h"
00003 #include "EmcStaticData.h"
00004 #include "EmcSector.h"
00005 //INCLUDECHECKER: Removed this line: #include "PHTimeStamp.h"
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 //INCLUDECHECKER: Removed this line: #include "PHCompositeNode.h"
00016 #include "PHIODataNode.h"
00017 //INCLUDECHECKER: Removed this line: #include "PHNodeIterator.h"
00018 //INCLUDECHECKER: Removed this line: #include "Event.h"
00019 
00020 #include <iostream>
00021 //INCLUDECHECKER: Removed this line: #include <memory>
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   // Pedestals are presently set to zero (Tony Frawley, 6/27/2002)
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         // Sector will be built from file if timestamp=0, 
00109         // from DB otherwise (assuming there's calibration
00110         // constants valid at timestamp in the DB, of course!)
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       //      cout<<"Collecting through DataManager: absPosition "<<absPosition;
00120       gOK[absPosition] = dm->Read(gains[absPosition], when, code);
00121       //      cout<<((gOK[absPosition])? " OK " : " Failed ")<<endl;
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   //... now do de-calibration ...
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     // Leave the pre values as they are
00205 
00206     float tmp_lpre = (float)dEmcRawData->get_adclopre(iraw);
00207     float tmp_hpre = (float)dEmcRawData->get_adchipre(iraw);
00208 
00209     // Adjust the post values to get the signal right for the real gains
00210     // Remember lower gain translates to more ADC counts for the same energy
00211     // Higher gain has fewer ADC counts for the same energy
00212 
00213     // Get the energy from hipost and hipre (actually minus the energy here)
00214 
00215     float hi_energy = (float) (dEmcRawData->get_adchipost(iraw)-
00216                                dEmcRawData->get_adchipre(iraw)) * (0.008);
00217 
00218     // This has to be divided by 16, since the net ADC counts will be 
00219     // multiplied by 16 in L2EmcDataAccessor before being multiplied by 
00220     // the gain 
00221 
00222     hi_energy = hi_energy/16;
00223 
00224     // Now convert the energy back into counts using the real data gain
00225 
00226     float tmp_hpost = (hi_energy/final_gain[towerID] + 
00227                        dEmcRawData->get_adchipre(iraw)) + pedestal[towerID];
00228 
00229     // Get the energy from lopost and lopre
00230 
00231     float lo_energy = (float) (dEmcRawData->get_adclopost(iraw)-
00232                                dEmcRawData->get_adclopre(iraw)) * 0.001;
00233 
00234     // Now convert the energy back into counts using the real data gain
00235 
00236     float tmp_lpost = (lo_energy/final_gain[towerID] + 
00237                        dEmcRawData->get_adclopre(iraw)) + pedestal[towerID];
00238 
00239 
00240 
00241     // set the values in the new table
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 //... get TowerID from softkey ...
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 }