00001
00002
00003
00004
00005
00006
00007 #include <StMuDSTMaker/COMMON/StMuDstMaker.h>
00008 #include <StMuDSTMaker/COMMON/StMuDst.h>
00009 #include <StMuDSTMaker/COMMON/StMuTriggerIdCollection.h>
00010 #include <StMuDSTMaker/COMMON/StMuEvent.h>
00011 #include <StMuDSTMaker/COMMON/StMuTrack.h>
00012 #include <StMuDSTMaker/COMMON/StMuPrimaryVertex.h>
00013
00014 #include "StEmcRawMaker/defines.h"
00015 #include "StEmcUtil/database/StBemcTables.h"
00016
00017 #include "StEEmcUtil/database/StEEmcDb.h"
00018 #include "StEEmcUtil/database/EEmcDbItem.h"
00019
00020 #include "StEmcUtil/geometry/StEmcGeom.h"
00021 #include "StEEmcUtil/EEmcGeom/EEmcGeomSimple.h"
00022
00023 #include "St2009WMaker.h"
00024
00025
00026 int
00027 St2009WMaker::accessTrig(){
00028
00029 if (isMC){
00030
00031
00032
00033
00034
00035
00036 if (!passes_L0()) return -1;
00037 hA[0]->Fill("BHT3Id",1.);
00038 if(!passes_L2()) return -2;
00039 hA[0]->Fill("L2wId",1.);
00040
00041 if(isMC>300){
00042 StMuEvent* muEve = mMuDstMaker->muDst()->event();
00043 StL0Trigger *trig=&(muEve->l0Trigger());
00044 wEve.bx48=trig->bunchCrossingId();
00045 wEve.bx7=trig->bunchCrossingId7bit(par_inpRunNo);
00046 }
00047
00048 wEve.l2bitET=true;
00049 return 0;
00050 }
00051
00052 StMuEvent* muEve = mMuDstMaker->muDst()->event();
00053
00054
00055 int highestT=0;
00056 int highestM=0;
00057 for (int m=0;m<300;m++)
00058 {
00059 int myT=muEve->emcTriggerDetector().highTower(m);
00060 if (myT>highestT)
00061 {
00062 highestT=myT;
00063 highestM=m;
00064 }
00065 }
00066 int highestPhi, tempPhi, tempEta;
00067 int awaySum[16];
00068 int totalSum=0;
00069 for (int i=0;i<16;i++) awaySum[i]=0;
00070
00071 patchToEtaPhi(highestM,&tempEta,&highestPhi);
00072
00073 for (int m=0;m<300;m++)
00074 {
00075 int myT=muEve->emcTriggerDetector().highTower(m);
00076 patchToEtaPhi(m,&tempEta,&tempPhi);
00077 for (int away_width=0;away_width<16;away_width++)
00078 if ((highestPhi+30-tempPhi)%30>(15-away_width) && (highestPhi+30-tempPhi)%30<(15+away_width))
00079 {
00080
00081 awaySum[away_width]+=myT;
00082 }
00083 totalSum+=myT;
00084 }
00085 for (int i=0;i<16;i++) wEve.trigAwaySum[i]=awaySum[i];
00086 wEve.trigTotalSum=totalSum;
00087
00088
00089 StMuTriggerIdCollection *tic=&(muEve->triggerIdCollection());
00090 assert(tic);
00091 const StTriggerId &l1=tic->l1();
00092 vector<unsigned int> idL=l1.triggerIds();
00093
00094
00095 for(unsigned int i=0;i<idL.size(); i++){
00096 char txt[100];
00097 sprintf(txt,"%d",idL[i]);
00098 hA[1]->Fill(txt,1.);
00099 }
00100
00101
00102 if(!tic->nominal().isTrigger(par_bht3TrgID)) return -1;
00103 hA[0]->Fill("BHT3Id",1.);
00104 if(!tic->nominal().isTrigger(par_l2wTrgID)) return -2;
00105 hA[0]->Fill("L2wId",1.);
00106
00107 TArrayI& l2Array = muEve->L2Result();
00108 LOG_DEBUG <<Form("AccessL2Decision() from regular muDst: L2Ar-size=%d",l2Array.GetSize())<<endm;
00109 unsigned int *l2res=(unsigned int *)l2Array.GetArray();
00110
00111 const int BEMCW_off=20;
00112
00113 wEve.l2algo= ( L2wResult2009 *) &l2res[BEMCW_off];
00114
00115 wEve.l2bitET=(wEve.l2algo->trigger&2)>0;
00116 wEve.l2bitRnd=(wEve.l2algo->trigger&1)>0;
00117 StL0Trigger *trig=&(muEve->l0Trigger());
00118 wEve.bx48=trig->bunchCrossingId();
00119 wEve.bx7=trig->bunchCrossingId7bit(mRunNo);
00120
00121 if( (wEve.l2bitRnd || wEve.l2bitET)==0) return -3;
00122 hA[0]->Fill("L2wBits",1.);
00123
00124
00125 if(wEve.l2bitRnd) {
00126 hA[0]->Fill("L2wRnd",1.);
00127 hA[61]->Fill(wEve.bx7);
00128 for (int m=0;m<300;m++){
00129 int val=muEve->emcTriggerDetector().highTower(m);
00130 hA[7]->Fill(val);
00131 }
00132 }
00133
00134 if(!wEve.l2bitET) return -3;
00135 if(wEve.l2bitET) hA[0]->Fill("L2wET",1.);
00136
00137
00138 hA[2]->Fill(wEve.bx48);
00139 hA[3]->Fill(wEve.bx7);
00140
00141
00142 for (int m=0;m<300;m++) {
00143 int val=muEve->emcTriggerDetector().highTower(m);
00144 if(wEve.l2bitET) hA[6]->Fill(val);
00145 if(val<par_DsmThres) continue;
00146 if(wEve.l2bitET) hA[8]->Fill(m);
00147
00148 }
00149 return 0;
00150 }
00151
00152
00153
00154
00155 int
00156 St2009WMaker::accessVertex(){
00157 int nInpPrimV=mMuDstMaker->muDst()->numberOfPrimaryVertices();
00158 if(nInpPrimV <par_minPileupVert) return -1;
00159 hA[0]->Fill("tpcOn",1.);
00160
00161 int nVer=0;
00162 for(int iv=0;iv<nInpPrimV;iv++) {
00163 StMuPrimaryVertex* V= mMuDstMaker->muDst()->primaryVertex(iv);
00164 assert(V);
00165 mMuDstMaker->muDst()->setVertexIndex(iv);
00166 float rank=V->ranking(), funnyR=999;
00167 if(rank>1e6) funnyR=log(rank-1e6)+10;
00168 else if(rank>0) funnyR=log(rank);
00169 else funnyR=log(rank+1e6)-10;
00170 hA[10]->Fill(funnyR);
00171 if (rank<=0) continue;
00172 const StThreeVectorF &r=V->position();
00173
00174 hA[11]->Fill(r.z());
00175
00176
00177 if(isMC>=350)
00178 hA[190]->Fill(r.z(),hReweight->GetBinContent(hReweight->FindBin(r.z())));
00179
00180 nVer++;
00181 if(fabs(r.z()) > par_vertexZ) continue;
00182 WeveVertex wv;
00183 wv.id=iv;
00184 wv.z=r.z();
00185 wv.funnyRank=funnyR;
00186 wEve.vertex.push_back(wv);
00187 }
00188 if(nVer<=0) return -2;
00189 hA[0]->Fill("primVert",1.);
00190 hA[4]->Fill(wEve.bx48);
00191 hA[5]->Fill(wEve.bx7);
00192
00193
00194 StMuEvent* muEve = mMuDstMaker->muDst()->event();
00195 for (int m=0;m<300;m++) {
00196 int val=muEve->emcTriggerDetector().highTower(m);
00197 if(val<par_DsmThres) continue;
00198 if(wEve.l2bitET) hA[9]->Fill(m);
00199 }
00200
00201 hA[12]->Fill(wEve.vertex.size());
00202 if(wEve.vertex.size()<=0) return -3;
00203 hA[0]->Fill("vertZ",1.);
00204 return 0;
00205 }
00206
00207
00208
00209
00210
00211 int
00212 St2009WMaker::accessTracks(){
00213 int nTrOK=0;
00214
00215 for(uint iv=0;iv<wEve.vertex.size(); iv++) {
00216 uint vertID=wEve.vertex[iv].id;
00217 assert(vertID<mMuDstMaker->muDst()->numberOfPrimaryVertices());
00218 assert(vertID>=0);
00219 StMuPrimaryVertex* V= mMuDstMaker->muDst()->primaryVertex(vertID);
00220 assert(V);
00221
00222 mMuDstMaker->muDst()->setVertexIndex(vertID);
00223 float rank=V->ranking();
00224 assert(rank>0);
00225 Int_t nPrimTrAll=mMuDstMaker->muDst()->GetNPrimaryTrack();
00226 for(int itr=0;itr<nPrimTrAll;itr++) {
00227 StMuTrack *prTr=mMuDstMaker->muDst()->primaryTracks(itr);
00228 if(prTr->flag()<=0) continue;
00229 const StMuTrack *glTr=prTr->globalTrack();
00230 if(glTr==0) continue;
00231 if(prTr->flag()!=301) continue;
00232 hA[20]->Fill("101",1.);
00233 float pt=prTr->pt();
00234 if(pt<1.0) continue;
00235 hA[20]->Fill("pt1",1.);
00236
00237
00238 StThreeVectorF ro=glTr->lastPoint();
00239 int secID=WtpcFilter::getTpcSec(ro.phi(),ro.pseudoRapidity());
00240 if ( mTpcFilter[secID-1].accept(prTr)==false) continue;
00241
00242 if (secID==20) continue;
00243
00244
00245
00246 hA[21]->Fill(prTr->nHitsFit());
00247 float hitFrac=1.*prTr->nHitsFit()/prTr->nHitsPoss();
00248 hA[22]->Fill(hitFrac);
00249 hA[23]->Fill(glTr->firstPoint().perp());
00250 hA[24]->Fill(ro.perp());
00251
00252 hA[25]->Fill(glTr->p().perp());
00253 if(glTr->charge()<0) hA[27]->Fill(glTr->p().perp());
00254
00255 hA[29]->Fill(pt);
00256 if(prTr->charge()<0)hA[30]->Fill(pt);
00257
00258 hA[26]->Fill(ro.pseudoRapidity(),ro.phi());
00259 if(pt>5)
00260 hA[57]->Fill(ro.pseudoRapidity(),ro.phi());
00261
00262
00263
00264
00265 float globChi2dof=glTr->chi2();
00266 hA[35]->Fill(globChi2dof);
00267 {
00268 StThreeVectorF ri=glTr->firstPoint();
00269 if(ri.z()>0 && ro.z()>0) hA[58]->Fill(globChi2dof);
00270 if(ri.z()<0 && ro.z()<0) hA[59]->Fill(globChi2dof);
00271 }
00272
00273 hA[36]->Fill(globChi2dof,ro.pseudoRapidity());
00274
00275 float dedx=prTr->dEdx()*1e6;
00276
00277 hA[28]->Fill(prTr->p().mag(),dedx);
00278
00279 if(pt<par_trackPt) continue;
00280 hA[20]->Fill("ptOK",1.);
00281 nTrOK++;
00282 WeveEleTrack wTr;
00283
00284 wTr.prMuTrack=prTr;
00285 wTr.glMuTrack=glTr;
00286 StThreeVectorF prPvect=prTr->p();
00287 wTr.primP=TVector3(prPvect.x(),prPvect.y(),prPvect.z());
00288
00289 wEve.vertex[iv].eleTrack.push_back(wTr);
00290 }
00291 }
00292 if(nTrOK<=0) return -1;
00293 hA[0]->Fill("Pt10",1.);
00294 return 0;
00295 }
00296
00297
00298
00299
00300
00301
00302
00303
00304
00305
00306
00307
00308
00309
00310
00311
00312
00313
00314
00315
00316
00317
00318
00319
00320
00321
00322
00323
00324
00325
00326
00327
00328
00329
00330
00331
00332
00333
00334
00335
00336
00337
00338
00339
00340
00341
00342
00343
00344
00345
00346
00347
00348 int
00349 St2009WMaker::accessBTOW(){
00350
00351 StMuEmcCollection* emc = mMuDstMaker->muDst()->muEmcCollection();
00352 if (!emc) {
00353 gMessMgr->Warning() <<"No EMC data for this event"<<endm; return -4;
00354 }
00355
00356 int ibp=kBTow;
00357 int jBP=BTOW;
00358 int n5=0,n0=0,n1=0,n2=0,n3=0,n4=0;
00359 int maxID=0;
00360 double maxADC=0,adcSum=0;
00361 for (int softID=1; softID <=mxBtow ; softID++) {
00362 float rawAdc= emc->getTowerADC(softID);
00363 if(rawAdc==0) n0++;
00364
00365 int statPed,statOfl,statGain;
00366 mBarrelTables->getStatus(jBP, softID, statPed,"pedestal");
00367 mBarrelTables->getStatus(jBP, softID, statOfl);
00368 mBarrelTables->getStatus(jBP, softID, statGain,"calib");
00369
00370 if(statPed!=1) {
00371 wEve.bemc.statTile[ibp][softID-1]=1;
00372 n1++; continue;}
00373 if(statOfl!=1) {
00374 wEve.bemc.statTile[ibp][softID-1]=2;
00375 n2++; continue;}
00376 if(statGain!=1) {
00377 wEve.bemc.statTile[ibp][softID-1]=4;
00378 n3++; continue;}
00379
00380 wEve.bemc.statTile[ibp][softID-1]=0 ;
00381
00382
00383 float ped,sigPed,gain;
00384 int capID=0;
00385 mBarrelTables->getPedestal(jBP,softID,capID,ped,sigPed);
00386 mBarrelTables->getCalib(jBP, softID, 1, gain);
00387 if (use_gains_file == 1) {
00388 gain = gains_BTOW[softID];
00389 }
00390
00391
00392
00393 gain=gain*par_btowScale;
00394
00395 float adc=rawAdc-ped;
00396 if(adc>0) n4++;
00397 if(adc<par_kSigPed*sigPed) continue;
00398 if(adc<par_AdcThres) continue;
00399 n5++;
00400 wEve.bemc.adcTile[ibp][softID-1]=adc;
00401 wEve.bemc.eneTile[ibp][softID-1]=adc*gain;
00402
00403 if(maxADC<adc) { maxID=softID; maxADC=adc;}
00404 adcSum+=adc;
00405 }
00406
00407 if(isMC>0 && isMC<20) assert(n1==0);
00408
00409 if(n0==mxBtow) return -1 ;
00410
00411 wEve.bemc.tileIn[ibp]=1;
00412
00413 if(nInpEve%5000==1) {
00414 LOG_INFO << Form("unpackMuBTOW() dataIn=%d, nBbad: ped=%d stat=%d gain=%d ; nAdc: %d>0, %d>thres\n maxADC=%.0f softID=%d adcSum=%.0f",
00415 wEve.bemc.tileIn[ibp],n1,n2,n3,n4,n5,
00416 maxADC,maxID,adcSum
00417 )<<endm;
00418 }
00419 hA[31]->Fill(maxADC);
00420 hA[32]->Fill(adcSum);
00421
00422 if(maxADC<par_maxADC) return -2 ;
00423
00424 return 0;
00425 }
00426
00427
00428
00429
00430 int
00431 St2009WMaker::accessETOW(){
00432
00433 StMuEmcCollection* emc = mMuDstMaker->muDst()->muEmcCollection();
00434 if (!emc) {
00435 LOG_WARN <<"No EMC data for this event"<<endm; return -4;
00436 }
00437
00438
00439 for (int i=0; i< emc->getNEndcapTowerADC(); i++) {
00440 int sec,eta,sub,rawAdc;
00441 emc->getEndcapTowerADC(i,rawAdc,sec,sub,eta);
00442
00443 const EEmcDbItem *x=mDbE->getTile(sec,'A'+sub-1,eta,'T');
00444 assert(x);
00445 if(x->fail ) continue;
00446 int isec=x->sec-1;
00447 int isub=x->sub-'A';
00448 int ieta=x->eta-1;
00449
00450 assert(isec>=0 && isec<mxEtowSec);
00451 assert(isub>=0 && isub<mxEtowSub);
00452 assert(ieta>=0 && ieta<mxEtowEta);
00453
00454 float adc=rawAdc-x->ped;
00455 if(adc<par_kSigPed*x->sigPed) continue;
00456
00457 wEve.etow.adc[isec*mxEtowSub+isub][ieta]=adc;
00458
00459 if(x->gain<=0) continue;
00460 float ene=adc/x->gain;
00461
00462
00463 ene*=par_etowScale;
00464 wEve.etow.ene[isec*mxEtowSub+isub][ieta]=ene;
00465 wEve.etow.stat[isec*mxEtowSub+isub][ieta]=0;
00466
00467 }
00468
00469 return 0;
00470 }
00471
00472
00473
00474 float
00475 St2009WMaker::sumTpcCone(int vertID, TVector3 refAxis, int flag, int &nTrCnt){
00476
00477
00478
00479
00480
00481 int nTR=0;
00482 assert(vertID>=0);
00483 assert(vertID<(int)mMuDstMaker->muDst()->numberOfPrimaryVertices());
00484
00485 StMuPrimaryVertex* V= mMuDstMaker->muDst()->primaryVertex(vertID);
00486 assert(V);
00487 mMuDstMaker->muDst()->setVertexIndex(vertID);
00488 float rank=V->ranking();
00489 assert(rank>0);
00490 double ptSum=0;
00491 Int_t nPrimTrAll=mMuDstMaker->muDst()->GetNPrimaryTrack();
00492 for(int itr=0;itr<nPrimTrAll;itr++) {
00493 StMuTrack *prTr=mMuDstMaker->muDst()->primaryTracks(itr);
00494 if(prTr->flag()<=0) continue;
00495 if(prTr->flag()!=301) continue;
00496 float hitFrac=1.*prTr->nHitsFit()/prTr->nHitsPoss();
00497 if(hitFrac<par_nHitFrac) continue;
00498 StThreeVectorF prPvect=prTr->p();
00499 TVector3 primP=TVector3(prPvect.x(),prPvect.y(),prPvect.z());
00500
00501 if(flag==1) {
00502 float deltaPhi=refAxis.DeltaPhi(primP);
00503 if(fabs(deltaPhi)> par_awayDeltaPhi) continue;
00504 }
00505 if(flag==2 || flag==3) {
00506 float deltaR=refAxis.DeltaR(primP);
00507
00508 if(flag==2 && deltaR>par_nearDeltaR) continue;
00509 if(flag==3 && deltaR>par_smallNearDeltaR) continue;
00510 }
00511 float pT=prTr->pt();
00512
00513 if(pT>par_countTrPt) nTR++;
00514 if(pT>par_trackPt) ptSum+=par_trackPt;
00515 else ptSum+=pT;
00516 }
00517
00518 nTrCnt=nTR;
00519 return ptSum;
00520 }
00521
00522
00523
00524
00525 void
00526 St2009WMaker::accessBSMD(){
00527 const char cPlane[ mxBSmd]={'E','P'};
00528
00529 StMuEmcCollection* emc = mMuDstMaker->muDst()->muEmcCollection();
00530 if (!emc) {
00531 gMessMgr->Warning() <<"No EMC data for this muDst event"<<endm; return;
00532 }
00533
00534
00535 for(int iEP=bsmde; iEP<=bsmdp;iEP++) {
00536 int iep=iEP-3; assert(bsmde==3);
00537 int nh= emc->getNSmdHits(iEP);
00538
00539 int n5=0,n1=0,n2=0,n3=0,n4=0;
00540 for (int i=0; i < nh; i++) {
00541 StMuEmcHit *hit=emc->getSmdHit(i,iEP);
00542 float adc=hit->getAdc();
00543 int softID=hit->getId();
00544
00545 int statPed,statOfl,statGain;
00546 mBarrelTables->getStatus(iEP, softID, statPed,"pedestal");
00547 mBarrelTables->getStatus(iEP, softID, statOfl);
00548 mBarrelTables->getStatus(iEP, softID, statGain,"calib");
00549
00550 if(statPed!=1) {
00551 wEve.bemc.statBsmd[iep][softID-1]=1;
00552 n1++; continue;}
00553 if(statOfl!=1) {
00554 wEve.bemc.statBsmd[iep][softID-1]=2;
00555 n2++; continue;}
00556 if(statGain<1 || statGain>19) {
00557 wEve.bemc.statBsmd[iep][softID-1]=4;
00558 n3++; continue;}
00559
00560 float pedRes,sigPed,gain;
00561 int capID=0;
00562 mBarrelTables->getPedestal(iEP,softID,capID,pedRes,sigPed);
00563 mBarrelTables->getCalib(iEP, softID, 1, gain);
00564
00565 if(isMC) {
00566 float par_bsmdAbsGain=6e6;
00567 float de = hit->getEnergy();
00568 adc=de*par_bsmdAbsGain;
00569 } else {
00570 adc-=pedRes;
00571 if(adc>0) n4++;
00572 if(adc<par_kSigPed*sigPed) continue;
00573 adc*=gain;
00574 }
00575
00576 n5++;
00577 assert(softID>=1); assert(softID<=mxBStrips);
00578 int id0=softID-1;
00579 wEve.bemc.adcBsmd[ iep][id0]=adc;
00580 hA[70+10*iep]->Fill(adc);
00581
00582
00583 }
00584 if(nTrigEve%5000==1) {
00585 LOG_INFO << Form("unpackMuBSMD-%c() nBbad: ped=%d stat=%d gain=%d ; nAdc: %d>0, %d>thres", cPlane[iep],n1,n2,n3,n4,n5)<<endm;
00586 }
00587 }
00588
00589 }
00590
00591
00592
00593
00594 void
00595 St2009WMaker::hadronicRecoil(){
00596
00597 for(uint iv=0;iv<wEve.vertex.size();iv++) {
00598 WeveVertex &V=wEve.vertex[iv];
00599 for(uint it=0;it<V.eleTrack.size();it++) {
00600 WeveEleTrack &T=V.eleTrack[it];
00601 if(T.isMatch2Cl==false) continue;
00602
00603 TVector3 recoil;
00604
00605
00606 for(int i=0;i< mxBtow;i++) {
00607 float ene=wEve.bemc.eneTile[kBTow][i];
00608 if(ene<=0) continue;
00609 TVector3 primP=positionBtow[i]-TVector3(0,0,V.z);
00610 primP.SetMag(ene);
00611 float deltaR=T.primP.DeltaR(primP);
00612 if(deltaR< par_nearDeltaR) continue;
00613 recoil+=primP;
00614 }
00615
00616
00617 for(int iphi=0; iphi<mxEtowPhiBin; iphi++){
00618 for(int ieta=0; ieta<mxEtowEta; ieta++){
00619 float ene=wEve.etow.ene[iphi][ieta];
00620 if(ene<=0) continue;
00621 TVector3 primP=positionEtow[iphi][ieta]-TVector3(0,0,V.z);
00622 primP.SetMag(ene);
00623 float deltaR=T.primP.DeltaR(primP);
00624 if(deltaR< par_nearDeltaR) continue;
00625 recoil+=primP;
00626 }
00627 }
00628
00629
00630 int vertID=V.id;
00631 assert(vertID>=0);
00632 assert(vertID<(int)mMuDstMaker->muDst()->numberOfPrimaryVertices());
00633
00634 StMuPrimaryVertex* V= mMuDstMaker->muDst()->primaryVertex(vertID);
00635 assert(V);
00636 mMuDstMaker->muDst()->setVertexIndex(vertID);
00637 float rank=V->ranking();
00638 assert(rank>0);
00639 Int_t nPrimTrAll=mMuDstMaker->muDst()->GetNPrimaryTrack();
00640 for(int itr=0;itr<nPrimTrAll;itr++) {
00641 StMuTrack *prTr=mMuDstMaker->muDst()->primaryTracks(itr);
00642 if(prTr->flag()<=0) continue;
00643 if(prTr->flag()!=301) continue;
00644 float hitFrac=1.*prTr->nHitsFit()/prTr->nHitsPoss();
00645 if(hitFrac<par_nHitFrac) continue;
00646 StThreeVectorF prPvect=prTr->p();
00647 TVector3 primP=TVector3(prPvect.x(),prPvect.y(),prPvect.z());
00648 float deltaR=T.primP.DeltaR(primP);
00649 if(deltaR< par_nearDeltaR) continue;
00650 if(primP.Perp()<0.15) continue;
00651 recoil+=primP;
00652 }
00653
00654 T.hadronicRecoil=recoil;
00655
00656 }
00657 }
00658 }
00659
00660
00661
00662
00663
00664
00665
00666
00667
00668
00669
00670
00671
00672
00673
00674
00675
00676
00677
00678
00679
00680
00681
00682
00683
00684
00685
00686
00687
00688
00689
00690
00691
00692
00693
00694
00695
00696
00697
00698
00699
00700
00701
00702
00703
00704
00705
00706
00707
00708
00709
00710
00711