00001
00002
00003
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
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
00039
00040
00041
00042
00043
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
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
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
00094 }
00095
00096
00097 return sc;
00098 }
00099
00100 StatusCode CalRecLogsAlg::finalize()
00101
00102 {
00103 StatusCode sc = StatusCode::SUCCESS;
00104
00105
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
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
00168
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 }