Main Page   Class Hierarchy   Compound List   File List   Compound Members   File Members   Related Pages  

CalRecLogsAlg.cxx

Go to the documentation of this file.
00001 
00002 //#include "Event/dataManager.h"
00003 //#include "Event/messageManager.h"
00004 #include "CalRecon/CalBase.h"
00005 #include "CalRecon/CalPedCalib.h"
00006 #include "CalRecon/CalCalibLogs.h"
00007 #include "CalRecon/CalRecLogsAlg.h"
00008 #include "CalRecon/CalADCLogs.h"
00009 #include "CalRecon/CalRecLogs.h"
00010 #include "GaudiKernel/MsgStream.h"
00011 #include "GaudiKernel/AlgFactory.h"
00012 #include "GaudiKernel/IDataProviderSvc.h"
00013 #include "GaudiKernel/SmartDataPtr.h"
00014 
00015 static const AlgFactory<CalRecLogsAlg>  Factory;
00016 const IAlgFactory& CalRecLogsAlgFactory = Factory;
00017 
00018 
00019 // constructor
00020 CalRecLogsAlg::CalRecLogsAlg(const std::string& name, ISvcLocator* pSvcLocator):
00021 Algorithm(name, pSvcLocator) {
00022     declareProperty("PedFile",m_PedFileName);
00023     declareProperty("GainFile",m_GainFileName);
00024     declareProperty("IntlinFile",m_IntlinFileName);
00025     declareProperty("RailFile",m_RailFileName);
00026     declareProperty("SlopeFile",m_SlopeFileName);
00027     
00028 }
00029 
00030 
00031 //################################################
00032 StatusCode CalRecLogsAlg::initialize()
00033 //################################################
00034 {
00035     MsgStream log(msgSvc(), name());
00036     StatusCode sc = StatusCode::SUCCESS;
00037     /*  
00038     m_CalPedLogs   = dataManager::instance()->getData("CalPedCalib",m_CalPedLogs);
00039     m_CalCalibLogs = dataManager::instance()->getData("CalCalibLogs",m_CalCalibLogs);
00040     m_CalGeoLogs   = dataManager::instance()->geo()->cal();
00041     
00042       m_CalRawLogs   = dataManager::instance()->getData("CalRawLogs",m_CalRawLogs);
00043       m_CalRecLogs   = dataManager::instance()->getData("CalRecLogs",m_CalRecLogs);
00044     */
00045     sc = service("CalGeometrySvc", m_CalGeo);
00046 
00047     if(sc.isFailure())
00048     {
00049         log <<MSG::ERROR << "Error ICalGeometrySvc not found" << endreq;
00050         return sc;
00051     }
00052     
00053     
00054     
00055     m_CalPedLogs  = new CalPedCalib(); 
00056     m_CalPedLogs->setFileName(m_PedFileName);
00057     m_CalPedLogs->make();
00058     
00059     m_CalCalibLogs = new CalCalibLogs();
00060     m_CalCalibLogs->setFileNames(m_IntlinFileName, m_GainFileName, m_RailFileName, m_SlopeFileName);
00061     m_CalCalibLogs->make();
00062     
00063     
00064     //  m_CalRecLogs->clear();
00065     
00066     return sc;
00067 }
00068 //################################################
00069 StatusCode CalRecLogsAlg::execute()
00070 //################################################
00071 {
00072         StatusCode sc = StatusCode::SUCCESS;
00073         sc = retrieve();
00074         int nLogs = m_CalRawLogs->num();
00075         for (int jlog = 0; jlog < nLogs ; jlog++) {
00076                 
00077                 CalADCLog* ADCLog = m_CalRawLogs->Log(jlog);
00078 
00079                 int ilayer          = ADCLog->layer();
00080                 CalDetGeo::axis view   = ADCLog->view();
00081             int icol            = ADCLog->column();
00082 
00083 //              detGeo*    geoLog = m_CalGeoLogs->getLog(ilayer,view,icol);
00084                 CalDetGeo geoLog = m_CalGeo->getLog(ilayer,view,icol);
00085 
00086                 
00087                 CalADCLog* pedLog = m_CalPedLogs->getLogID(CalLogID::ID(ilayer,view,icol));
00088                 CalCalibLog* calibLog = m_CalCalibLogs->getLogID(CalLogID::ID(ilayer,view,icol));
00089 
00090                 CalRecLog* recLog = m_CalRecLogs->getLogID(CalLogID::ID(ilayer,view,icol));
00091                 computeEnergy(recLog, ADCLog, pedLog, calibLog);
00092                 computePosition(recLog,&geoLog, calibLog);
00093 //              std::cout << " ilayer = " << ilayer << " view=" << view << " icol=" << icol << std::endl;
00094         }
00095 //      m_CalRecLogs->writeOut();
00096 
00097         return sc;
00098 }
00099 //################################################
00100 StatusCode CalRecLogsAlg::finalize()
00101 //################################################
00102 {
00103         StatusCode sc = StatusCode::SUCCESS;
00104 
00105 //      m_CalRecLogs->writeOut();
00106 
00107         return sc;
00108 }
00109 
00110 //################################################
00111 StatusCode CalRecLogsAlg::retrieve()
00112 //################################################
00113 {
00114         
00115     MsgStream log(msgSvc(), name());
00116     StatusCode sc = StatusCode::SUCCESS;
00117 
00118         m_CalRecLogs = 0;
00119         m_CalRecLogs = new CalRecLogs();
00120 
00121 DataObject* pnode=0;
00122 
00123     sc = eventSvc()->retrieveObject( "/Event/CalRecon", pnode );
00124     
00125     if( sc.isFailure() ) {
00126         sc = eventSvc()->registerObject("/Event/CalRecon",new DataObject);
00127         if( sc.isFailure() ) {
00128             
00129             log << MSG::ERROR << "Could not create CalRecon directory" << endreq;
00130             return sc;
00131         }
00132     }
00133 
00134     
00135 
00136         m_CalRawLogs = SmartDataPtr<CalADCLogs>(eventSvc(),"/Event/CalRecon/CalADCLogs"); 
00137 
00138 
00139          sc = eventSvc()->registerObject("/Event/CalRecon/CalRecLogs",m_CalRecLogs);
00140         return sc;
00141 }
00142 
00143 //----------------- private ----------------------
00144 //################################################
00145 void CalRecLogsAlg::computeEnergy(CalRecLog* recLog, const CalADCLog* ADCLog,
00146                                                                   const CalADCLog* pedLog, const CalCalibLog* calibLog)
00147 //################################################
00148 {
00149         
00150         double MAXPED = 4095.;
00151         double ADCSATURATION = 3850;
00152         bool eneSet = false;
00153         for (int irange = 0; irange < CALNRANGES ; irange++) {
00154                 CalBase::RANGE r = (irange == 0? CalBase::LEX : CalBase::LE);
00155                 double eneNeg = 0.;
00156         double enePos = 0.;
00157                 double adcNeg = 0.;
00158                 double adcPos = 0.;
00159                 double adcSatNeg = 0.;
00160                 double adcSatPos = 0.;
00161                 for (int iside = 0; iside < CALNSIDES; iside++) {
00162                         CalBase::SIDE s = (iside == 0? CalBase::NEG : CalBase::POS);
00163                         if (irange > 1) r = (irange == 2? CalBase::HEX : CalBase::HE);
00164                         double adc = ADCLog->ADC(s,r);
00165                         double ped = pedLog->ADC(s,r);
00166                         double adc_ped = adc - ped;
00167                         //if (s== CalBase::NEG) recLog->setNegADC(r,(adc-ped)/(MAXPED-ped));
00168                         //else recLog->setPosADC(r,(adc-ped)/(MAXPED-ped));
00169                         if (s== CalBase::NEG) recLog->setNegADC(r,adc_ped);
00170                         else recLog->setPosADC(r,adc_ped);
00171 
00172                         double adcSat = 0.6*(calibLog->getRail(iside,irange));
00173                         double ene = calibLog->adc_to_MeV(adc_ped,iside,irange);
00174                         iside == 0? eneNeg = ene: enePos = ene;
00175                         iside == 0? adcNeg = adc_ped: adcPos = adc_ped;
00176                         iside == 0? adcSatNeg = adcSat: adcSatPos = adcSat;
00177                 }
00178                 recLog->setNegEnergy(r,eneNeg);
00179                 recLog->setPosEnergy(r,enePos);
00180                 if(adcNeg<50 || adcPos<50)eneNeg=enePos=0;
00181 
00182                 if (!eneSet && (adcNeg < adcSatNeg && adcPos < adcSatPos)) {
00183                         eneSet = true;
00184                         recLog->setNegEnergy(eneNeg);
00185                         recLog->setPosEnergy(enePos);
00186             recLog->setBestRange(r);
00187                 }
00188         }
00189 }
00190 //################################################
00191 void CalRecLogsAlg::computePosition(CalRecLog* recLog, const CalDetGeo* geoLog,
00192                                                                         const CalCalibLog* calibLog)
00193 //################################################
00194 {
00195         Point pCenter = geoLog->position();
00196         Point pSize   = geoLog->size();
00197         
00198         CalDetGeo::axis view = recLog->view();
00199         double xdir = 0.;
00200         double ydir = 0.;
00201         ydir = (view == CalDetGeo::X? 1. : 0);
00202         xdir = (view == CalDetGeo::Y? 1. : 0);
00203 
00204         Vector dirLog(xdir,ydir,0.); 
00205         
00206         
00207         double eneNeg = recLog->negEnergy();
00208         double enePos = recLog->posEnergy();
00209         double asym = recLog->asymmetry();
00210         double slope = calibLog->getSlope(recLog->bestRange());
00211 
00212         Point pLog = pCenter+dirLog*asym*slope;
00213 
00214         recLog->setPosition(pLog);
00215 }

Generated on Thu Nov 29 16:38:48 2001 by doxygen1.2.12 written by Dimitri van Heesch, © 1997-2001