#include <TofCaliSvc.h>
Inheritance diagram for TofCaliSvc:
Public Member Functions | |
virtual const double | BAtten (unsigned id)=0 |
const double | BAtten (unsigned int id) |
const double | BAtten (unsigned int id) |
virtual const double | BGainBackward (unsigned id)=0 |
const double | BGainBackward (unsigned int id) |
const double | BGainBackward (unsigned int id) |
virtual const double | BGainForward (unsigned id)=0 |
const double | BGainForward (unsigned int id) |
const double | BGainForward (unsigned int id) |
const double | BPh (double ADC1, double ADC2, double zHit, unsigned int id) |
const double | BPh (double ADC1, double ADC2, double zHit, unsigned int id) |
const double | BPulseHeight (double ADC1, double ADC2, double zHit, double sint, unsigned int id) |
const double | BPulseHeight (double ADC1, double ADC2, double zHit, double sint, unsigned int id) |
const double | BPulseHeight1 (double ADC, double zHit, double sint, unsigned int id) |
const double | BPulseHeight1 (double ADC, double zHit, double sint, unsigned int id) |
const double | BPulseHeight2 (double ADC, double zHit, double sint, unsigned int id) |
const double | BPulseHeight2 (double ADC, double zHit, double sint, unsigned int id) |
const int | BrEast (unsigned int No) |
const int | BrEast (unsigned int No) |
const int | BrWest (unsigned int No) |
const int | BrWest (unsigned int No) |
virtual const double | BSigma1 (double zHit, unsigned id)=0 |
const double | BSigma1 (double zHit, unsigned int id) |
const double | BSigma1 (double zHit, unsigned int id) |
virtual const double | BSigma2 (double zHit, unsigned id)=0 |
const double | BSigma2 (double zHit, unsigned int id) |
const double | BSigma2 (double zHit, unsigned int id) |
virtual const double | BSigmaCluster (double zHit1, double zHit2, unsigned id1, unsigned id2)=0 |
const double | BSigmaCluster (double zHit1, double zHit2, unsigned int id1, unsigned int id2) |
const double | BSigmaCluster (double zHit1, double zHit2, unsigned int id1, unsigned int id2) |
virtual const double | BSigmaCounter (double zHit, unsigned id)=0 |
const double | BSigmaCounter (double zHit, unsigned int id) |
const double | BSigmaCounter (double zHit, unsigned int id) |
const double | BTCorr1 (double ADC, double zHit, unsigned int id) |
const double | BTCorr1 (double ADC, double zHit, unsigned int id) |
const double | BTCorr2 (double ADC, double zHit, unsigned int id) |
const double | BTCorr2 (double ADC, double zHit, unsigned int id) |
const double | BTCorrOffset1 (double zHit, unsigned int id) |
const double | BTCorrOffset1 (double zHit, unsigned int id) |
const double | BTCorrOffset2 (double zHit, unsigned int id) |
const double | BTCorrOffset2 (double zHit, unsigned int id) |
virtual const double | BTDelay1 (unsigned id)=0 |
const double | BTDelay1 (unsigned int id) |
const double | BTDelay1 (unsigned int id) |
virtual const double | BTDelay2 (unsigned id)=0 |
const double | BTDelay2 (unsigned int id) |
const double | BTDelay2 (unsigned int id) |
virtual const double | BTime1 (double ADC, double TDC, double zHit, unsigned id)=0 |
const double | BTime1 (double ADC, double TDC, double zHit, unsigned int id) |
const double | BTime1 (double ADC, double TDC, double zHit, unsigned int id) |
virtual const double | BTime2 (double ADC, double TDC, double zHit, unsigned id)=0 |
const double | BTime2 (double ADC, double TDC, double zHit, unsigned int id) |
const double | BTime2 (double ADC, double TDC, double zHit, unsigned int id) |
virtual const double | BTimeCluster (double tlayer1, double tlayer2, double z1, double z2, unsigned id1, unsigned int id2)=0 |
const double | BTimeCluster (double tlayer1, double tlayer2, double z1, double z2, unsigned int id1, unsigned int id2) |
const double | BTimeCluster (double tlayer1, double tlayer2, double z1, double z2, unsigned int id1, unsigned int id2) |
virtual const double | BTimeCounter (double tleft, double tright, double z, unsigned id)=0 |
const double | BTimeCounter (double tleft, double tright, double z, unsigned int id) |
const double | BTimeCounter (double tleft, double tright, double z, unsigned int id) |
virtual BTofCal * | BTof (unsigned id) const =0 |
BTofCal * | BTof (unsigned int id) const |
BTofCal * | BTof (unsigned int id) const |
BTofCommonCal * | BTofCommon () const |
BTofCommonCal * | BTofCommon () const |
virtual const double | BVeff (unsigned id)=0 |
const double | BVeff (unsigned int id) |
const double | BVeff (unsigned int id) |
void | Dump () |
void | Dump () |
virtual const double | EAtten (unsigned id)=0 |
const double | EAtten (unsigned int id) |
const double | EAtten (unsigned int id) |
virtual const double | EGain (unsigned id)=0 |
const double | EGain (unsigned int id) |
const double | EGain (unsigned int id) |
const int | Endcap (unsigned int No) |
const int | Endcap (unsigned int No) |
const double | EPh (double ADC, double rHit, unsigned int id) |
const double | EPh (double ADC, double rHit, unsigned int id) |
const double | EPulseHeight (double ADC, double rHit, double cost, unsigned int id) |
const double | EPulseHeight (double ADC, double rHit, double cost, unsigned int id) |
virtual const double | ESigma (double rHit, unsigned id)=0 |
const double | ESigma (double rHit, unsigned int id) |
const double | ESigma (double rHit, unsigned int id) |
virtual const double | ETDelay (unsigned id)=0 |
const double | ETDelay (unsigned int id) |
const double | ETDelay (unsigned int id) |
virtual const double | ETime (double ADC, double TDC, double rHit, unsigned id)=0 |
const double | ETime (double ADC, double TDC, double rHit, unsigned int id) |
const double | ETime (double ADC, double TDC, double rHit, unsigned int id) |
virtual ETofCal * | ETof (unsigned id) const =0 |
ETofCal * | ETof (unsigned int id) const |
ETofCal * | ETof (unsigned int id) const |
virtual const double | EVeff (unsigned id)=0 |
const double | EVeff (unsigned int id) |
const double | EVeff (unsigned int id) |
virtual StatusCode | finalize () |
virtual StatusCode | finalize () |
virtual const double | getQ0 (unsigned id)=0 |
const double | getQ0 (unsigned int id) |
const double | getQ0 (unsigned int id) |
void | handle (const Incident &) |
void | handle (const Incident &) |
virtual StatusCode | initialize () |
virtual StatusCode | initialize () |
const int | MisLable () |
const int | MisLable () |
const int | QCorr () |
const int | QCorr () |
const int | QElec () |
const int | QElec () |
virtual StatusCode | queryInterface (const InterfaceID &riid, void **ppvUnknown) |
virtual StatusCode | queryInterface (const InterfaceID &riid, void **ppvUnknown) |
const int | RunBegin () |
const int | RunBegin () |
const int | RunEnd () |
const int | RunEnd () |
TofCaliSvc (const std::string &name, ISvcLocator *svcloc) | |
TofCaliSvc (const std::string &name, ISvcLocator *svcloc) | |
const double | TOffset () |
const double | TOffset () |
TofInfoCal * | TofInfo () const |
TofInfoCal * | TofInfo () const |
const int | Version () |
const int | Version () |
virtual const double | ZADC (double qleft, double qright, unsigned id)=0 |
const double | ZADC (double qleft, double qright, unsigned int id) |
const double | ZADC (double qleft, double qright, unsigned int id) |
virtual const double | ZADC1 (double qright, unsigned id, double z)=0 |
const double | ZADC1 (double qright, unsigned int id, double z) |
const double | ZADC1 (double qright, unsigned int id, double z) |
virtual const double | ZADC2 (double qleft, unsigned id, double z)=0 |
const double | ZADC2 (double qleft, unsigned int id, double z) |
const double | ZADC2 (double qleft, unsigned int id, double z) |
virtual const double | ZTDC (double tleft, double tright, unsigned id)=0 |
const double | ZTDC (double tleft, double tright, unsigned int id) |
const double | ZTDC (double tleft, double tright, unsigned int id) |
virtual const double | ZTDC1 (double tright, unsigned id, double z)=0 |
const double | ZTDC1 (double tright, unsigned int id, double z) |
const double | ZTDC1 (double tright, unsigned int id, double z) |
virtual const double | ZTDC2 (double tleft, unsigned id, double z)=0 |
const double | ZTDC2 (double tleft, unsigned int id, double z) |
const double | ZTDC2 (double tleft, unsigned int id, double z) |
~TofCaliSvc () | |
~TofCaliSvc () | |
Static Public Member Functions | |
const InterfaceID & | interfaceID () |
const InterfaceID & | interfaceID () |
Private Member Functions | |
StatusCode | FillfromDatabase () |
StatusCode | FillfromDatabase () |
Private Attributes | |
std::vector< BTofCal * > | fBTofCal |
std::vector< BTofCal * > | fBTofCal |
std::vector< BTofCommonCal * > | fBTofCommonCal |
std::vector< BTofCommonCal * > | fBTofCommonCal |
std::vector< ETofCal * > | fETofCal |
std::vector< ETofCal * > | fETofCal |
std::vector< TofInfoCal * > | fTofInfoCal |
std::vector< TofInfoCal * > | fTofInfoCal |
bool | m_hasbeeninitialized |
IDataProviderSvc * | m_pCalibDataSvc |
IDataProviderSvc * | m_pCalibDataSvc |
IntegerProperty | m_run |
|
00044 : Service(name, svcloc) {
00045 declareProperty("Run",m_run=1);
00046 }
|
|
00095 { 00096 for(vector<BTofCal*>::iterator it1 = fBTofCal.begin(); it1 != fBTofCal.end(); it1++) { delete (*it1); } 00097 fBTofCal.clear(); 00098 for(vector<ETofCal*>::iterator it2 = fETofCal.begin(); it2 != fETofCal.end(); it2++) { delete (*it2); } 00099 fETofCal.clear(); 00100 for(vector<BTofCommonCal*>::iterator it3 = fBTofCommonCal.begin(); it3 != fBTofCommonCal.end(); it3++) { delete (*it3); } 00101 fBTofCommonCal.clear(); 00102 for(vector<TofInfoCal*>::iterator it4 = fTofInfoCal.begin(); it4 != fTofInfoCal.end(); it4++) { delete (*it4); } 00103 fTofInfoCal.clear(); 00104 return; 00105 }
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Implements ITofCaliSvc. |
|
Implements ITofCaliSvc. 00540 { 00541 double length = 230.0; 00542 double Latten = fBTofCal[id]->getAtten(0); 00543 double gainRatio = fBTofCal[id]->getAtten(1); 00544 double q = ( ADC1*TMath::Exp((0.5*length-zHit)/Latten)+ADC2*TMath::Exp((0.5*length+zHit)/Latten) )/(1.0+TMath::Exp(gainRatio)); 00545 return q; 00546 }
|
|
Implements ITofCaliSvc. |
|
Implements ITofCaliSvc. 00530 { 00531 double length = 230.0; 00532 double Latten = fBTofCal[id]->getAtten(0); 00533 double gainRatio = fBTofCal[id]->getAtten(1); 00534 double A2 = fBTofCal[id]->getAtten(2); 00535 double q = ( ADC1*sint*TMath::Exp((0.5*length-zHit)/Latten)+ADC2*sint*TMath::Exp((0.5*length+zHit)/Latten) )/( A2*(1.0+TMath::Exp(gainRatio)) ); 00536 return q; 00537 }
|
|
Implements ITofCaliSvc. |
|
Implements ITofCaliSvc. 00512 { 00513 double length = 230.0; 00514 double A = 1.0; 00515 double Latten = fBTofCal[id]->getAtten(0); 00516 double q0 = ADC*sint*TMath::Exp((0.5*length-zHit)/Latten)/A; 00517 return q0; 00518 }
|
|
Implements ITofCaliSvc. |
|
Implements ITofCaliSvc. 00521 { 00522 double length = 230.0; 00523 double A = 1.0; 00524 double Latten = fBTofCal[id]->getAtten(0); 00525 double q0 = ADC*sint*TMath::Exp((0.5*length+zHit)/Latten)/A; 00526 return q0; 00527 }
|
|
Implements ITofCaliSvc. |
|
Implements ITofCaliSvc. 00705 { 00706 return fTofInfoCal[0]->getBrEast(im); 00707 }
|
|
Implements ITofCaliSvc. |
|
Implements ITofCaliSvc. 00709 { 00710 return fTofInfoCal[0]->getBrWest(im); 00711 }
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Implements ITofCaliSvc. |
|
Implements ITofCaliSvc. |
|
Implements ITofCaliSvc. |
|
Implements ITofCaliSvc. |
|
Implements ITofCaliSvc. |
|
Implements ITofCaliSvc. |
|
Implements ITofCaliSvc. |
|
Implements ITofCaliSvc. |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Implements ITofCaliSvc. |
|
Implements ITofCaliSvc. 00725 { 00726 return fBTofCommonCal[0]; 00727 }
|
|
|
|
|
|
|
|
Implements ITofCaliSvc. |
|
Implements ITofCaliSvc. 00733 { 00734 std::cout<<"Now We can get the TOF Calibtration Service"<<std::endl; 00735 std::cout<<"Barrel TOF Counter Number = "<<fBTofCal.size()<<std::endl; 00736 std::cout<<"Endcap TOF Counter Number = "<<fETofCal.size()<<std::endl; 00737 00738 cout<<"The O Barrel TOF PMT1 p1[0] is"<<" "<<BTof(0)->getP1(0)<<endl; 00739 cout<<"The 0 Barrel TOF PMT1 p1[1] is"<<" "<<BTof(0)->getP1(1)<<endl; 00740 cout<<"The 0 Barrel TOF veff is"<<" "<<BTof(0)->getVeff(0)<<endl; 00741 // cout<<"The 22rd Endcap TOF PMT veff is"<<" "<<ETof(22)->getVeff()<<endl; 00742 }
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Implements ITofCaliSvc. |
|
Implements ITofCaliSvc. 00713 { 00714 return fTofInfoCal[0]->getEndcap(im); 00715 }
|
|
Implements ITofCaliSvc. |
|
Implements ITofCaliSvc. 00562 { 00563 double length = 44.5; 00564 double a0 = fETofCal[id]->getAtten(0); 00565 double a1 = fETofCal[id]->getAtten(1); 00566 double a2 = fETofCal[id]->getAtten(2); 00567 double q0 = ADC*TMath::Exp(-(a0+a1*(rHit-length)+a2*(rHit-length)*(rHit-length))); 00568 return q0; 00569 }
|
|
Implements ITofCaliSvc. |
|
Implements ITofCaliSvc. 00549 { 00550 double length = 44.5; 00551 double a0 = fETofCal[id]->getAtten(0); 00552 double a1 = fETofCal[id]->getAtten(1); 00553 double a2 = fETofCal[id]->getAtten(2); 00554 double a3 = fETofCal[id]->getAtten(3); 00555 00556 double q0 = ADC*fabs(cost)*TMath::Exp(-(a1*(rHit-length)+a2*(rHit-length)*(rHit-length)))/a3; 00557 00558 return q0; 00559 }
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
00106 { 00107 00108 MsgStream log(msgSvc(), name()); 00109 std::string fullPath = "/Calib/TofCal"; 00110 log << MSG::INFO<<" Tof calib fullPath = "<<fullPath<< endreq; 00111 SmartDataPtr<CalibData::TofCalibData> test(m_pCalibDataSvc, fullPath); 00112 if(!test){ 00113 log << MSG::FATAL << "TofCaliSvc could not find TofCalibData in TCDS!!" << endreq; 00114 return StatusCode::FAILURE; 00115 } 00116 00117 for(vector<BTofCal*>::iterator it1 = fBTofCal.begin(); it1 != fBTofCal.end(); it1++) { delete (*it1); } 00118 fBTofCal.clear(); 00119 for(vector<ETofCal*>::iterator it2 = fETofCal.begin(); it2 != fETofCal.end(); it2++) { delete (*it2); } 00120 fETofCal.clear(); 00121 for(vector<BTofCommonCal*>::iterator it3 = fBTofCommonCal.begin(); it3 != fBTofCommonCal.end(); it3++) { delete (*it3); } 00122 fBTofCommonCal.clear(); 00123 for(vector<TofInfoCal*>::iterator it4 = fTofInfoCal.begin(); it4 != fTofInfoCal.end(); it4++) { delete (*it4); } 00124 fTofInfoCal.clear(); 00125 00126 for(int ib=0;ib<176;ib++){ 00127 BTofCal* btof = new BTofCal; 00128 for( int j=0; j<static_cast<int>(nBarAtten); j++ ) { 00129 btof->setAtten(j,test->getBTofAtten(ib,j)); 00130 } 00131 for( int j=0; j<static_cast<int>(nBarSpeed); j++ ) { 00132 btof->setVeff(j,test->getBTofSpeed(ib,j)); 00133 } 00134 for( int j=0; j<static_cast<int>(nBarPar); j++){ 00135 btof->setP1(j,test->getBTofPleft(ib,j)); 00136 btof->setP2(j,test->getBTofPright(ib,j)); 00137 } 00138 for( int j=0; j<static_cast<int>(nBarParOff); j++){ 00139 btof->setPOff1(j,test->getBTofPoffleft(ib,j)); 00140 btof->setPOff2(j,test->getBTofPoffright(ib,j)); 00141 } 00142 for( int j=0; j<static_cast<int>(nBarSigma); j++){ 00143 btof->setFPLeft(j,test->getBTofFleft(ib,j)); 00144 btof->setFPRight(j,test->getBTofFright(ib,j)); 00145 } 00146 for( int j=0; j<static_cast<int>(nBarSigCnt); j++){ 00147 btof->setFPCounter(j,test->getBTofFcounter(ib,j)); 00148 } 00149 00150 fBTofCal.push_back(btof); 00151 } 00152 00153 for(int ie=0;ie<96;ie++){ 00154 ETofCal* etof= new ETofCal; 00155 for( int j=0; j<static_cast<int>(nEndAtten); j++ ) { 00156 etof->setAtten(j,test->getETofAtten(ie,j)); 00157 } 00158 for( int j=0; j<static_cast<int>(nEndSpeed); j++ ) { 00159 etof->setVeff(j,test->getETofSpeed(ie,j)); 00160 } 00161 for( int j=0; j<static_cast<int>(nEndPar); j++ ) { 00162 etof->setP(j,test->getETofP(ie,j)); 00163 } 00164 for( int j=0; j<static_cast<int>(nEndSigma); j++ ) { 00165 etof->setFPCounter(j,test->getETofFP(ie,j)); 00166 } 00167 fETofCal.push_back(etof); 00168 } 00169 00170 BTofCommonCal* bcomtof = new BTofCommonCal; 00171 for(int i=0; i<static_cast<int>(nBarOffset); i++) { 00172 bcomtof->setOffset( i, test->getBTofOffset(i) ); 00173 } 00174 for(int i=0; i<static_cast<int>(nBarSigCor); i++) { 00175 bcomtof->setSigmaCorr( i, test->getBTofSigmaCorr(i) ); 00176 } 00177 fBTofCommonCal.push_back(bcomtof); 00178 00179 TofInfoCal* tofinfo = new TofInfoCal; 00180 tofinfo->setRunBegin( test->getRunBegin() ); 00181 tofinfo->setRunEnd( test->getRunEnd() ); 00182 tofinfo->setVersion( test->getVersion() ); 00183 tofinfo->setQCorr( test->getQCorr() ); 00184 tofinfo->setQElec( test->getQElec() ); 00185 tofinfo->setMisLable( test->getMisLable() ); 00186 for( unsigned int i=0; i<5; i++ ) { 00187 tofinfo->setBrEast( i, test->getBrEast(i) ); 00188 tofinfo->setBrWest( i, test->getBrWest(i) ); 00189 tofinfo->setEndcap( i, test->getEndcap(i) ); 00190 } 00191 fTofInfoCal.push_back(tofinfo); 00192 00193 return StatusCode::SUCCESS; 00194 00195 }
|
|
|
|
00089 { 00090 MsgStream log(msgSvc(), name()); 00091 log << MSG::INFO << name() << ": End of Run" << endreq; 00092 return StatusCode::SUCCESS; 00093 }
|
|
|
|
|
|
|
|
|
|
00744 { 00745 MsgStream log( messageService(), name() ); 00746 log << MSG::DEBUG << "handle: " << inc.type() << endreq; 00747 00748 if ( inc.type() == "NewRun" ){ 00749 log << MSG::DEBUG << "New Run" << endreq; 00750 // if(!m_hasbeeninitialized){ 00751 StatusCode sc= FillfromDatabase(); 00752 if(sc.isSuccess()){ 00753 m_hasbeeninitialized=true; 00754 } 00755 // } 00756 } 00757 }
|
|
|
|
00057 { 00058 m_hasbeeninitialized=false; 00059 00060 MsgStream log(msgSvc(), name()); 00061 log << MSG::INFO << name() << ": Start of run initialisation" << endreq; 00062 00063 StatusCode sc = Service::initialize(); 00064 if ( sc.isFailure() ) return sc; 00065 00066 IIncidentSvc* incsvc; 00067 sc = service("IncidentSvc", incsvc); 00068 int priority = 100; 00069 if( sc.isSuccess() ){ 00070 incsvc -> addListener(this, "NewRun", priority); 00071 } 00072 00073 StatusCode scc; 00074 00075 log<<MSG::INFO << "setProperties()" << endreq; 00076 scc = service("CalibDataSvc", m_pCalibDataSvc, true); 00077 if ( !scc.isSuccess() ) { 00078 log<<MSG::ERROR<<"Could not get IDataProviderSvc interface of CalibXmlCnvSvc"<<endreq; 00079 return scc; 00080 } else { 00081 log << MSG::DEBUG<< "Retrieved IDataProviderSvc interface of CalibXmlCnvSvc"<<endreq; 00082 } 00083 // Get properties from the JobOptionsSvc 00084 scc = setProperties(); 00085 00086 return sc; 00087 }
|
|
00018 { return IID_ITofCaliSvc; }
|
|
00018 { return IID_ITofCaliSvc; }
|
|
Implements ITofCaliSvc. |
|
Implements ITofCaliSvc. 00701 { 00702 return fTofInfoCal[0]->getMisLable(); 00703 }
|
|
Implements ITofCaliSvc. |
|
Implements ITofCaliSvc. 00693 { 00694 return fTofInfoCal[0]->getQCorr(); 00695 }
|
|
Implements ITofCaliSvc. |
|
Implements ITofCaliSvc. 00697 { 00698 return fTofInfoCal[0]->getQElec(); 00699 }
|
|
|
|
00048 { 00049 if ( IID_ITofCaliSvc.versionMatch(riid) ) { 00050 *ppvInterface = static_cast<ITofCaliSvc*> (this); 00051 } else { 00052 return Service::queryInterface(riid, ppvInterface) ; 00053 } 00054 return StatusCode::SUCCESS; 00055 }
|
|
Implements ITofCaliSvc. |
|
Implements ITofCaliSvc. 00681 { 00682 return fTofInfoCal[0]->getRunBegin(); 00683 }
|
|
Implements ITofCaliSvc. |
|
Implements ITofCaliSvc. 00685 { 00686 return fTofInfoCal[0]->getRunEnd(); 00687 }
|
|
Implements ITofCaliSvc. |
|
Implements ITofCaliSvc. 00313 { 00314 double toffset = fBTofCommonCal[0]->getOffset(0); 00315 return toffset; 00316 }
|
|
Implements ITofCaliSvc. |
|
Implements ITofCaliSvc. 00729 { 00730 return fTofInfoCal[0]; 00731 }
|
|
Implements ITofCaliSvc. |
|
Implements ITofCaliSvc. 00689 { 00690 return fTofInfoCal[0]->getVersion(); 00691 }
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|