00001 #include "QMLFTool.h"
00002 #include "OpPara.h"
00003 #include "GeomPara.h"
00004
00005 #include "Event/RecTrigger.h"
00006
00007 #include "Event/CalibReadout.h"
00008 #include "Event/CalibReadoutPmtCrate.h"
00009
00010 #include "CLHEP/Vector/ThreeVector.h"
00011 #include "CLHEP/Units/SystemOfUnits.h"
00012 #include "DetHelpers/IPmtGeomInfoSvc.h"
00013 #include "DetHelpers/ICoordSysSvc.h"
00014 #include "Conventions/Detectors.h"
00015 #include "Conventions/Reconstruction.h"
00016 #include "DataSvc/ICableSvc.h"
00017 #include "DataSvc/ICalibDataSvc.h"
00018
00019 #include "TMinuit.h"
00020 #include "TMath.h"
00021
00022 #include "DetDesc/Material.h"
00023 #include "DetDesc/IGeometryInfo.h"
00024 #include "DetDesc/Surface.h"
00025 #include "DetDesc/TabulatedProperty.h"
00026
00027 using namespace Gaudi;
00028 using namespace DayaBay;
00029 using namespace std;
00030
00031 ICableSvc *QMLFTool::m_cableSvc = 0;
00032 IPmtGeomInfoSvc *QMLFTool::m_pmtGeomSvc = 0;
00033 ICalibDataSvc *QMLFTool::m_pmtCalibDataSvc = 0;
00034
00035 DayaBay::CalibReadoutPmtCrate *QMLFTool::m_calibCrate = 0;
00036
00037 QMLFTool::ExpChgMap QMLFTool::m_expChgMap;
00038
00039 OpPara *QMLFTool::m_opPara = 0;
00040 GeomPara *QMLFTool::m_geomPara = 0;
00041 QMLFTool::UsedFeeChannelMap QMLFTool::m_timeLLFUsedChannels;
00042 QMLFTool::UsedFeeChannelMap QMLFTool::m_chgLLFUsedChannels;
00043
00044 int QMLFTool::m_LLFMode = 1;
00045 bool QMLFTool::m_addTimeLLF = 0;
00046 double QMLFTool::m_pmtChgCut = 0.0;
00047 bool QMLFTool::m_recExtInfo = 0;
00048
00049
00050 QMLFTool::QMLFTool(const std::string& type,
00051 const std::string& name,
00052 const IInterface* parent)
00053 : GaudiTool(type, name, parent)
00054
00055 {
00056 declareInterface<IReconTool>(this);
00057
00058 declareProperty("CableSvcName", m_cableSvcName = "StaticCableSvc",
00059 "Name of service to map between detector, hardware, and electronic IDs");
00060 declareProperty("PmtGeomSvcName", m_pmtGeomSvcName = "PmtGeomInfoSvc",
00061 "Name of Pmt Geometry Information Service");
00062 declareProperty("PmtCalibDataSvcName", m_pmtCalibDataSvcName = "StaticCalibDataSvc",
00063 "Name of Pmt Calib Data Information Service");
00064
00065
00066 declareProperty("LLFMode", m_LLFMode = 1, "Likelihood function mode");
00067 declareProperty("addTimeLLF", m_addTimeLLF = 0, "Add time likelihood or not");
00068 declareProperty("pmtChgCut", m_pmtChgCut = 12., "The charge cut for PMTs selection criteria");
00069 declareProperty("recExtInfo", m_recExtInfo = 0, "Extended information from reconstruction");
00070 declareProperty("opLocation", m_opLocation="DetDesc", "Optical parameters location");
00071 declareProperty("geomLocation", m_geomLocation="DetDesc", "Optical parameters location");
00072 declareProperty("AbsLength", m_ATTL=0., "Effective absorption length");
00073 declareProperty("TopRefZ", m_TopRefZpos=0., "Z position of top reflector");
00074 declareProperty("BotRefZ", m_BotRefZpos=0., "Z position of bottom reflector");
00075 declareProperty("TopReflectivity", m_TopRef=0., "Reflectivity of top reflector");
00076 declareProperty("BotReflectivity", m_BotRef=0., "Reflectivity of bottom reflector");
00077 }
00078
00079 QMLFTool::~QMLFTool() {}
00080
00081 StatusCode QMLFTool::initialize()
00082 {
00083
00084 m_cableSvc = svc<ICableSvc>(m_cableSvcName, true);
00085
00086 m_pmtGeomSvc = svc<IPmtGeomInfoSvc>(m_pmtGeomSvcName, true);
00087
00088
00089 m_pmtCalibDataSvc = svc<ICalibDataSvc>(m_pmtCalibDataSvcName, true);
00090
00091
00092 getOpPara(m_opLocation);
00093
00094
00095 getGeomPara(m_geomLocation);
00096
00097
00098 printPara();
00099
00100 return StatusCode::SUCCESS;
00101 }
00102
00103 StatusCode QMLFTool::finalize()
00104 {
00105 return StatusCode::SUCCESS;
00106 }
00107
00108 StatusCode QMLFTool::reconstruct(const DayaBay::CalibReadout& calibReadout,
00109 DayaBay::RecTrigger& recTrigger)
00110 {
00111 if( !calibReadout.detector().isAD() ) {
00112 debug() << "Not an AD readout; ignoring detector "
00113 << calibReadout.detector().detName() << endreq;
00114 recTrigger.setPositionStatus( ReconStatus::kNotProcessed);
00115 recTrigger.setEnergyStatus( ReconStatus::kNotProcessed);
00116 return StatusCode::SUCCESS;
00117 }
00118
00119
00120
00121
00122
00123 DayaBay::CalibReadout* calibTest
00124 = const_cast<DayaBay::CalibReadout*> (&calibReadout);
00125 DayaBay::CalibReadoutPmtCrate* calibCrate
00126 = dynamic_cast<DayaBay::CalibReadoutPmtCrate*> (calibTest);
00127 m_calibCrate = calibCrate;
00128
00129 if(!m_calibCrate) {
00130 error() << "Incorrect type of readout crate for detector "
00131 << calibReadout.detector().detName() << endreq;
00132 recTrigger.setPositionStatus(ReconStatus::kBadReadout);
00133 recTrigger.setEnergyStatus(ReconStatus::kBadReadout);
00134 return StatusCode::FAILURE;
00135 }
00136
00137 info() << "QMLFTool: test output" << endreq;
00138
00139
00140 setUsedChannels(calibCrate, &recTrigger);
00141
00142
00143
00144 const int Npar = 4;
00145 TMinuit *recMinuit = new TMinuit(Npar);
00146 int ierflg;
00147
00148 recMinuit->SetFCN(QMLFTool::NCLL_fcn);
00149 recMinuit->SetPrintLevel(1);
00150
00151
00152 double xini, yini, zini, eini, tini;
00153 xini = recTrigger.position().x();
00154 yini = recTrigger.position().y();
00155 zini = recTrigger.position().z();
00156 eini = recTrigger.energy();
00157 tini = recTrigger.triggerTime().GetNanoSec();
00158
00159 if(eini==0.0) {
00160 error() << "No initial energy value was set!" << endreq;
00161 }
00162 if(xini==0.0&&yini==0.0&&zini==0.0) {
00163 warning() << "No initial vertex was set!" << endreq;
00164 }
00165
00166
00167 recMinuit->mnparm(0, "xpos", xini, 100.0, 0.0, 0.0, ierflg);
00168 recMinuit->mnparm(1, "ypos", yini, 100.0, 0.0, 0.0, ierflg);
00169 recMinuit->mnparm(2, "zpos", zini, 10.0, m_geomPara->m_botRefZ, m_geomPara->m_topRefZ, ierflg);
00170 recMinuit->mnparm(3, "energy", eini, 0.1, 0.001, 1000.0, ierflg);
00171 if(m_addTimeLLF==1)
00172 recMinuit->mnparm(4, "T0", tini, 0.5, 0.0, 0.0, ierflg);
00173
00174 int err;
00175 double standin = 0.0;
00176 double maxCalls = 2000;
00177 double tolerance = 1.0e-3;
00178 double arglist[2];
00179
00180
00181 arglist[0] = 1;
00182 recMinuit->mnexcm("CALL FCN", arglist, 1, ierflg);
00183
00184
00185 recMinuit->mnexcm("SET NOW", &standin, 0, err);
00186
00187
00188
00189 if(m_LLFMode==1)
00190 recMinuit->SetErrorDef(1);
00191 else
00192 recMinuit->SetErrorDef(0.5);
00193
00194
00195 arglist[0] = 2;
00196 recMinuit->mnexcm("SET STR", arglist, 1, ierflg);
00197
00198
00199
00200 arglist[0] = maxCalls;
00201 arglist[1] = tolerance;
00202 recMinuit->mnexcm("MIGrad", arglist, 2, err);
00203
00204
00205
00206
00207
00208
00209
00210
00211
00212
00213
00214
00215 double ln0, edm, errdef;
00216 int nvpar, nparx, icstat;
00217 recMinuit->mnstat(ln0, edm, errdef, nvpar, nparx, icstat);
00218
00219
00220 double x_fit, x_fit_err;
00221 double y_fit, y_fit_err;
00222 double z_fit, z_fit_err;
00223 double e_fit, e_fit_err;
00224
00225 recMinuit->GetParameter(0, x_fit, x_fit_err);
00226 recMinuit->GetParameter(1, y_fit, y_fit_err);
00227 recMinuit->GetParameter(2, z_fit, z_fit_err);
00228 recMinuit->GetParameter(3, e_fit, e_fit_err);
00229
00230
00231 double emat[Npar][Npar];
00232 CLHEP::HepMatrix matrix(Npar, Npar);
00233 recMinuit->mnemat(&emat[0][0], Npar);
00234 for(int row=0; row<Npar; row++) {
00235 for(int col=0; col<Npar; col++) {
00236 matrix[row][col] = emat[row][col];
00237 }
00238 }
00239
00240 CLHEP::HepLorentzVector vertex(x_fit, y_fit, z_fit, 0.);
00241 recTrigger.setPosition(vertex);
00242 recTrigger.setEnergy(e_fit);
00243 recTrigger.setPositionQuality(ln0);
00244 recTrigger.setEnergyQuality(ln0);
00245 recTrigger.setErrorMatrix(matrix);
00246
00247 if(m_recExtInfo) {
00248 arglist[0] = 3;
00249 recMinuit->mnexcm("CALL FCN", arglist, 1, ierflg);
00250
00251
00252 }
00253 delete recMinuit;
00254
00255 return StatusCode::SUCCESS;
00256 }
00257
00258 void QMLFTool::NCLL_fcn(int& npar, double* grad, double& fval, double* xval, int iflag) {
00259
00260 if(iflag==1){
00261
00262
00263 }
00264 if(iflag==2){
00265
00266
00267 }
00268
00269
00270
00271
00272 double ECAL;
00273
00274 ECAL = m_opPara->m_photoCathodeArea/4.0/TMath::Pi()*m_opPara->m_yield;
00275 ECAL = ECAL * 0.20;
00276
00277
00279 double S_angle, dist;
00280 double expected_q, qhit, cosa_tmp;
00281 double sum_exp, AA, BB, LLF;
00282 double XD, YD, ZD, ED, ZF, dx, dy, dz, T0;
00283 double chg_likelihood, time_likelihood;
00284 int ipmt, npe;
00285
00287 XD = xval[0];
00288 YD = xval[1];
00289 ZD = xval[2];
00290 ED = xval[3]*ECAL;
00291 if(m_addTimeLLF==1) T0 = xval[4];
00292
00293 double sum_act = 0.0;
00294 sum_exp = 0.0;
00295 chg_likelihood = 0.0;
00296 time_likelihood = 0.0;
00297 double c_n = 200.;
00298
00299 DayaBay::CalibReadoutPmtCrate::PmtChannelReadouts::const_iterator cpcrIter,
00300 done = (m_calibCrate->channelReadout()).end();
00301
00302 Context context = m_calibCrate->header()->context();
00303 int task = 0;
00304 ServiceMode svcMode(context, task);
00305
00306 Site::Site_t site = m_calibCrate->detector().site();
00307 DetectorId::DetectorId_t detid = m_calibCrate->detector().detectorId();
00308
00309
00310
00311 double sumQ = 0.0, Xc, Yc, Zc;
00312 for(int local_id=0; local_id<192; local_id++) {
00313 int ring = local_id/24 + 1;
00314 int col = local_id%24 + 1;
00315
00316 AdPmtSensor adPmtId(ring, col, site, detid);
00317 FeeChannelId channelId = m_cableSvc->feeChannelId(adPmtId, svcMode);
00318
00319
00320 if(iflag!=3&&m_chgLLFUsedChannels[channelId]==false) continue;
00321
00322 DayaBay::CalibReadoutPmtChannel* cpcrPtr = m_calibCrate->sensor(adPmtId);
00323 if(cpcrPtr) {
00324 qhit = cpcrPtr->maxCharge();
00325 }else {
00326
00327 qhit = 0.0;
00328 }
00329
00330 unsigned int pmtid = adPmtId.fullPackedData();
00331 if(adPmtId.site() == Site::kSAB) {
00332 pmtid = DayaBay::AdPmtSensor(adPmtId.ring(),adPmtId.column(),Site::kDayaBay,adPmtId.detectorId()).fullPackedData();
00333 }
00334 CLHEP::Hep3Vector pos = m_pmtGeomSvc->get(pmtid)->localPosition();
00335 CLHEP::Hep3Vector norm = m_pmtGeomSvc->get(pmtid)->localDirection();
00336
00337
00338 const DayaBay::DetectorSensor& sensDetId
00339 = m_cableSvc->sensor(channelId, svcMode);
00340 const DayaBay::PmtCalibData* pmtData =
00341 m_pmtCalibDataSvc->pmtCalibData(sensDetId, svcMode);
00342
00343 AA = norm.x();
00344 BB = norm.y();
00345
00346 dx = XD - pos.x();
00347 dy = YD - pos.y();
00348 dz = ZD - pos.z();
00349
00350 dist = dx*dx + dy*dy + dz*dz;
00351 if(dist<0.0001) dist = 0.0001;
00352 dist = sqrt(dist);
00353
00354 cosa_tmp = ( AA*dx + BB*dy ) / dist;
00355 if(cosa_tmp>1.0) cosa_tmp = 1.0;
00356
00357
00358 if(m_addTimeLLF==1) {
00359 if(m_timeLLFUsedChannels[channelId]==true){
00360
00361
00362 double hittime = cpcrIter->earliestTime();
00363 time_likelihood = time_likelihood
00364 - 2*log(1./TMath::Sqrt(2*TMath::Pi())/pmtData->m_timeSpread)
00365 + TMath::Power((hittime-pmtData->m_timeOffset-dist/c_n-T0)/pmtData->m_timeSpread, 2);
00366 }
00367 }
00368
00369 S_angle = 0.378 + 0.5099*cosa_tmp + 0.1131*pow(cosa_tmp,2);
00370 if(S_angle<1.0e-5) S_angle = 1.0e-5;
00371
00372 expected_q = S_angle*exp(-dist/m_opPara->m_attl)/TMath::Power(dist, 2);
00373
00375
00376 int ref_deg;
00377 for(ref_deg=0; ref_deg<10; ref_deg++){
00378
00379 if(ref_deg==0)
00380 ZF = 2*m_geomPara->m_botRefZ - xval[2];
00381 else if(ref_deg==1)
00382 ZF = 2*m_geomPara->m_topRefZ - xval[2];
00383 else if(ref_deg==2)
00384 ZF = 2*m_geomPara->m_botRefZ - 2*m_geomPara->m_topRefZ + xval[2];
00385 else if(ref_deg==3)
00386 ZF = 2*m_geomPara->m_topRefZ - 2*m_geomPara->m_botRefZ + xval[2];
00387 else if(ref_deg==4)
00388 ZF = 4*m_geomPara->m_botRefZ - 2*m_geomPara->m_topRefZ - xval[2];
00389 else if(ref_deg==5)
00390 ZF = 4*m_geomPara->m_topRefZ - 2*m_geomPara->m_botRefZ - xval[2];
00391 else if(ref_deg==6)
00392 ZF = 4*m_geomPara->m_botRefZ - 4*m_geomPara->m_topRefZ + xval[2];
00393 else if(ref_deg==7)
00394 ZF = 4*m_geomPara->m_topRefZ - 4*m_geomPara->m_botRefZ + xval[2];
00395 else if(ref_deg==8)
00396 ZF = 6*m_geomPara->m_botRefZ - 4*m_geomPara->m_topRefZ - xval[2];
00397 else
00398 ZF = 6*m_geomPara->m_topRefZ - 4*m_geomPara->m_botRefZ - xval[2];
00399
00400 dz = ZF - pos.z();
00401
00402 dist = dx*dx + dy*dy + dz*dz;
00403 if(dist<0.0001) dist = 0.0001;
00404 dist = sqrt(dist);
00405
00406 cosa_tmp = ( AA*dx + BB*dy ) / dist;
00407 if(cosa_tmp>1.0) cosa_tmp = 1.0;
00408
00409 S_angle = 0.378 + 0.5099*cosa_tmp + 0.1131*pow(cosa_tmp,2);
00410 if(S_angle<1.0e-5) S_angle = 1.0e-5;
00411
00412 int index = (int)(ref_deg/2.0) + 1;
00413 int index_top, index_bot;
00414 if(ref_deg == 0)
00415 index_top = 0;
00416 else
00417 index_top = (int)((ref_deg-1)/4.0) + 1;
00418
00419 index_bot = index - index_top;
00420
00421 expected_q += TMath::Power(m_opPara->m_topRef, index_top)*TMath::Power(m_opPara->m_botRef, index_bot)*S_angle*TMath::Exp(-dist/m_opPara->m_attl)/TMath::Power(dist, 2);
00422 }
00423
00425
00426 double eff = pmtData->m_efficiency;
00427
00428 expected_q = ED * expected_q * eff;
00429 sum_exp = sum_exp + expected_q;
00430 sum_act = sum_act + qhit;
00431
00432 if(iflag==3) {
00433
00434 if(m_recExtInfo) m_expChgMap[channelId] = expected_q;
00435
00436 }
00437 else {
00438 if(m_LLFMode!=1){
00439
00440
00441 }
00442 else
00443 {
00445 if(qhit!=0.0)
00446 chg_likelihood = chg_likelihood + 2*(expected_q-qhit) + 2*log(qhit/expected_q)*qhit;
00447 else
00448 chg_likelihood = chg_likelihood + 2*expected_q;
00449 }
00450 }
00451
00452 }
00453
00454 fval = chg_likelihood;
00455 if(m_addTimeLLF==1) fval += time_likelihood;
00456 }
00457
00458 StatusCode QMLFTool::getOpPara(std::string &data_src) {
00459
00460
00461 m_opPara = new OpPara(1.25E+04, 0.98, 0.98, 9000, 3.14*103*103);
00462
00463 if(data_src=="DetDesc") {
00464
00465
00466
00467
00468
00469
00470
00471 IDataProviderSvc* dds = 0;
00472 StatusCode sc = service( "DetectorDataSvc", dds, true );
00473 if (sc.isFailure()) {
00474
00475 }
00476
00477
00478
00479
00480 std::string location = "/dd/Materials/GdDopedLS";
00481 Material* gdls = GaudiCommon<AlgTool>::get<Material>(dds,location);
00482
00483 Material::Tables& gdls_tab = gdls->tabulatedProperties();
00484 Material::Tables::const_iterator mtIter = gdls_tab.begin(),
00485 done = gdls_tab.end();
00486 TabulatedProperty::Table attl_vec;
00487 for(; mtIter!=done; mtIter++) {
00488 std::string type = (*mtIter)->type();
00489 if(type=="ABSLENGTH") {
00490 attl_vec = (*mtIter)->table();
00491 }
00492 }
00493 TabulatedProperty::Table::const_iterator tb_iter;
00494 int count = 0;
00495 double attl_tmp = 0.0, ref_tmp = 0.0;
00496 for(tb_iter=attl_vec.begin(); tb_iter!=attl_vec.end(); tb_iter++){
00497 if(tb_iter->first<3.18e-06 && tb_iter->first>2.07e-06 ){
00498 count++; attl_tmp += tb_iter->second;
00499 }
00500 }
00501 attl_tmp = attl_tmp/count;
00502 m_opPara->m_attl = attl_tmp;
00503
00504
00505 std::string topESR_location = "/dd/Geometry/AdDetails/AdSurfacesAll/ESRAirSurfaceTop";
00506 std::string botESR_location = "/dd/Geometry/AdDetails/AdSurfacesAll/ESRAirSurfaceBot";
00507
00508 Surface* esrtop = GaudiCommon<AlgTool>::get<Surface>(dds, topESR_location);
00509 Surface* esrbot = GaudiCommon<AlgTool>::get<Surface>(dds, botESR_location);
00510
00511 Surface::Tables& esrtop_tab = esrtop->tabulatedProperties();
00512 Surface::Tables& esrbot_tab = esrbot->tabulatedProperties();
00513
00514 Surface::Tables::const_iterator sfIter;
00515 TabulatedProperty::Table ref_vec;
00516
00517
00518 for(sfIter=esrtop_tab.begin(); sfIter!=esrtop_tab.end(); sfIter++) {
00519 std::string type = (*sfIter)->type();
00520 if(type=="REFLECTIVITY") {
00521 ref_vec = (*sfIter)->table();
00522 }
00523 }
00524 count = 0;
00525 for(tb_iter=ref_vec.begin(); tb_iter!=ref_vec.end(); tb_iter++){
00526 if(tb_iter->first<3.18e-06 && tb_iter->first>2.07e-06 ){
00527 count++; ref_tmp += tb_iter->second;
00528 }
00529 }
00530 ref_tmp = ref_tmp/count;
00531 m_opPara->m_topRef = ref_tmp;
00532
00533
00534 for(sfIter=esrbot_tab.begin(); sfIter!=esrbot_tab.end(); sfIter++) {
00535 std::string type = (*sfIter)->type();
00536 if(type=="REFLECTIVITY") {
00537 ref_vec = (*sfIter)->table();
00538 }
00539 }
00540 count = 0; ref_tmp = 0.0;
00541 for(tb_iter=ref_vec.begin(); tb_iter!=ref_vec.end(); tb_iter++){
00542 if(tb_iter->first<3.18e-06 && tb_iter->first>2.07e-06 ){
00543 count++; ref_tmp += tb_iter->second;
00544 }
00545 }
00546 ref_tmp = ref_tmp/count;
00547 m_opPara->m_botRef = ref_tmp;
00548
00549 } else if(data_src=="OpCalibSvc"){
00550
00551 } else {
00552
00553 warning() <<"No external optical data source, use default value."<< endreq;
00554 }
00555
00556
00557 if(m_ATTL!=0.) m_opPara->m_attl = m_ATTL;
00558 if(m_TopRef!=0.) m_opPara->m_topRef = m_TopRef;
00559 if(m_BotRef!=0.) m_opPara->m_botRef = m_BotRef;
00560
00561 return StatusCode::SUCCESS;
00562 }
00563
00564 StatusCode QMLFTool::getGeomPara(std::string &data_src) {
00565
00566
00567 m_geomPara = new GeomPara(2010., -2010.);
00568
00569 if(data_src=="DetDesc") {
00570
00571 IDataProviderSvc* dds = 0;
00572 StatusCode sc = service( "DetectorDataSvc", dds, true );
00573 if (sc.isFailure()) {
00574 error() << "No DetectorDataSvc available!" << endreq;
00575 }
00576
00577
00578 std::string topEsrPath = "/dd/Structure/AdReflectorStructure/db-ad/db-ad1-topesr";
00579 std::string botEsrPath = "/dd/Structure/AdReflectorStructure/db-ad/db-ad1-botesr";
00580 SmartDataPtr<IDetectorElement> topEsr(dds,topEsrPath);
00581 SmartDataPtr<IDetectorElement> botEsr(dds,botEsrPath);
00582
00583
00584
00585 ICoordSysSvc* css;
00586 sc = service( "CoordSysSvc", css, true );
00587
00588 Gaudi::XYZPoint zero(0,0,0);
00589
00590 Gaudi::XYZPoint globalPoint = topEsr->geometry()->toGlobal(zero);
00591 IDetectorElement* theAdDe = css->coordSysDE(globalPoint);
00592 Gaudi::XYZPoint adLocalPoint = theAdDe->geometry()->toLocal(globalPoint);
00593 m_geomPara->m_topRefZ = adLocalPoint.z();
00594
00595
00596 globalPoint = botEsr->geometry()->toGlobal(zero);
00597 theAdDe = css->coordSysDE(globalPoint);
00598 adLocalPoint = theAdDe->geometry()->toLocal(globalPoint);
00599 m_geomPara->m_botRefZ = adLocalPoint.z();
00600
00601 } else if(data_src=="OnsiteSuveyData"){
00602
00603
00604 } else {
00605
00606 warning() <<"Unknown geometry data source, use default value."<< endreq;
00607 }
00608
00609
00610 if(m_TopRefZpos!=0.) m_geomPara->m_topRefZ = m_TopRefZpos;
00611 if(m_BotRefZpos!=0.) m_geomPara->m_botRefZ = m_BotRefZpos;
00612
00613 return StatusCode::SUCCESS;
00614 }
00615
00616 StatusCode QMLFTool::printPara(){
00617 info() << "Op and Geom parameters used in reconstruction." << endreq;
00618 info() << "Attenuation length : " << m_opPara->m_attl <<"mm"<< endreq;
00619 info() << "Top reflectivity : " << m_opPara->m_topRef << endreq;
00620 info() << "Bottom reflectivity : " << m_opPara->m_botRef << endreq;
00621 info() << "Top reflector Z pos :" << m_geomPara->m_topRefZ <<"mm"<< endreq;
00622 info() << "Bot reflector Z pos :" << m_geomPara->m_botRefZ <<"mm"<< endreq;
00623
00624 return StatusCode::SUCCESS;
00625 }
00626
00627 StatusCode QMLFTool::setUsedChannels(
00628 const DayaBay::CalibReadoutPmtCrate* calibCrate,
00629 DayaBay::RecTrigger* recTrigger)
00630 {
00631 m_chgLLFUsedChannels.clear();
00632 m_timeLLFUsedChannels.clear();
00633
00634 DayaBay::CalibReadoutPmtCrate::PmtChannelReadouts::const_iterator cpcrIter,
00635 done = (calibCrate->channelReadout()).end();
00636
00637 Context context = calibCrate->header()->context();
00638 int task = 0;
00639 ServiceMode svcMode(context, task);
00640
00641 Site::Site_t site = calibCrate->detector().site();
00642 DetectorId::DetectorId_t detid = calibCrate->detector().detectorId();
00643
00644
00645 for(int local_id=0; local_id<192; local_id++) {
00646 int ring = local_id/24 + 1;
00647 int col = local_id%24 + 1;
00648
00649 AdPmtSensor adPmtId(ring, col, site, detid);
00650 FeeChannelId channelId = m_cableSvc->feeChannelId(adPmtId, svcMode);
00651
00652 const DayaBay::DetectorSensor& sensDetId = m_cableSvc->sensor(channelId, svcMode);
00653 const DayaBay::PmtCalibData* pmtData =
00654 m_pmtCalibDataSvc->pmtCalibData(sensDetId, svcMode);
00655
00656 if(pmtData->m_status==DayaBay::PmtCalibData::kGood) {
00657 m_chgLLFUsedChannels[channelId] = true;
00658 m_timeLLFUsedChannels[channelId] = false;
00659 }
00660 else {
00661 m_chgLLFUsedChannels[channelId] = false;
00662 m_timeLLFUsedChannels[channelId] = false;
00663 }
00664
00665 if(m_addTimeLLF==1) {
00666 DayaBay::CalibReadoutPmtChannel* cpcrPtr = m_calibCrate->sensor(adPmtId);
00667 if(cpcrPtr) {
00668 double qhit = cpcrPtr->maxCharge();
00669 if(qhit>m_pmtChgCut)
00670 m_timeLLFUsedChannels[channelId] = true;
00671 }
00672 }
00673
00674 }
00675
00676
00677
00678 return StatusCode::SUCCESS;
00679 }