00001 #include "gl3LMVertexFinder.h"
00002
00003 #include "gl3Event.h"
00004 #include "gl3HistoManager.h"
00005
00006 #include <assert.h>
00007 #include <rtsLog.h>
00008
00009
00010 #ifdef GL3ROOT
00011 static int lmvdbg=1;
00012 #else
00013 static int lmvdbg=0;
00014 #endif
00015 const float gl3LMVertexFinder::C_PI=3.1416926;
00016
00017
00018
00019
00020 gl3LMVertexFinder::gl3LMVertexFinder(int _minHitsOnTrack,
00021 int _minCTBadc,
00022 float _maxZdca,
00023 float _zMargin,
00024 float _phiMargin,
00025 float _delVertMax)
00026 {
00027 setParameters(_minHitsOnTrack, _minCTBadc, _maxZdca,
00028 _zMargin, _phiMargin, _delVertMax);
00029
00030 init();
00031 registerHistos();
00032 }
00033
00034
00035
00036
00037
00038 gl3LMVertexFinder::~gl3LMVertexFinder()
00039 {
00040 }
00041
00042
00043
00044
00045 int gl3LMVertexFinder::setParameters(int _minHitsOnTrack,
00046 int _minCTBadc,
00047 float _maxZdca,
00048 float _zMargin,
00049 float _phiMargin,
00050 float _delVertMax)
00051 {
00052 CtbRadius=213.;
00053 CtbLen2=255.;
00054
00055 minHitsOnTrack = _minHitsOnTrack;
00056 minCTBadc = _minCTBadc;
00057
00058 maxZdca = _maxZdca;
00059 MatchCtbMaxZ = CtbLen2/4. + _zMargin;
00060 MatchCtbMaxPhi = C_PI/30+_phiMargin/CtbRadius;
00061 DelVertMax = _delVertMax;
00062
00063 return 1;
00064 }
00065
00066
00067
00068
00069
00070
00071 int gl3LMVertexFinder::setParameters(const char *filename)
00072 {
00073 int minHitsOnTrack;
00074 int minCTBadc;
00075 float maxZdca;
00076 float zMargin;
00077 float phiMargin;
00078 float delVertMax;
00079
00080
00081 minHitsOnTrack = 10;
00082 minCTBadc = 3;
00083
00084 maxZdca = 250.0;
00085 zMargin = 10.0;
00086 phiMargin = 3.0;
00087 delVertMax = 3.0;
00088
00089
00090 FILE *fp = fopen(filename,"r");
00091 if(fp == NULL) return -1;
00092
00093 int ret=-1;
00094 if(fp) {
00095 ret=fscanf(fp,"%d %d %f %f %f %f",
00096 &minHitsOnTrack, &minCTBadc, &maxZdca,
00097 &zMargin, &phiMargin, &delVertMax);
00098 fclose(fp);
00099 }
00100 if(ret!=6) LOG(ERR,"gl3LMVertexFinder::setParameters() ERROR while reading %s file, ret=%d, default params used\n",filename,ret,0,0,0);
00101
00102 if(minCTBadc<0) LOG(ERR, "gl3LMVertexFinder::setParameters() WARN : CTB matching is off\n",0,0,0,0,0);
00103
00104 setParameters(minHitsOnTrack, minCTBadc, maxZdca,
00105 zMargin, phiMargin, delVertMax);
00106
00107 return 0;
00108 }
00109
00110
00111
00112
00113 int gl3LMVertexFinder::init () {
00114
00115 totInpEve=0;
00116 setCtbMap();
00117
00118 if(lmvdbg) LOG(ERR, "CTB matching limits del_Phi(deg)=%.1f, delZ(cm)=%f\n",
00119 MatchCtbMaxPhi/C_PI*180, MatchCtbMaxZ,0,0,0);
00120
00121
00122
00123
00124 hjan[0]= new gl3Histo ( "ppLMV0","ZDC vertex in Z (cm)",
00125 100, -200, 200. ) ;
00126 hjan[1]= new gl3Histo ( "ppLMV1","raw event track multiplicity",
00127 100, 0.,500.);
00128 hjan[2]= new gl3Histo ( "ppLMV2"," event multiplicity,with any CTB slat",
00129 50, 0., 500. );
00130 hjan[3]= new gl3Histo ( "ppLMV3"," HITS IN TRACK, all,with any CTB slat ",
00131 50, -0.5, 49.5 );
00132 hjan[4]= new gl3Histo ( "ppLMV4"," Zdca (cm), long tracks",
00133 50, -300., 300. );
00134 hjan[5]= new gl3Histo ( "ppLMV5"," Zdca-ZvertexZDC (cm)",
00135 50, -200., 200. );
00136 hjan[6]= new gl3Histo ( "ppLMV6","non-zero ADC's for CTB",
00137 51, -0.5, 50.5 );
00138 hjan[7]= new gl3Histo ( "ppLMV7"," CTB slats with ADC>th",
00139 240, -0.5, 239.5 );
00140 hjan[8]= new gl3Histo ( "ppLMV8"," <z> of CTB with ADC>th",
00141 10, -300., 300. );
00142 hjan[9]= new gl3Histo ( "ppLMV9","pasX #Delta#phi (deg) from MatchCTB",
00143 100, -10., 10. );
00144 hjan[10]= new gl3Histo("ppLMV10","pasX #DeltaZ (cm) from MatchCTB",
00145 50, -100., 100. );
00146 hjan[11]= new gl3Histo("ppLMV11","number of tracks matched to CTB/eve",
00147 50, -0.5, 49.5 );
00148 hjan[12]= new gl3Histo("ppLMV12","number of accepted CTB slats/eve",
00149 250, -0.5, 249.5 );
00150 hjan[13]= new gl3Histo( "ppLMV13","counter of accepted events",
00151 7,0.5,7.5);
00152 hjan[14]= new gl3Histo( "ppLMV14","counter of accepted tracks",
00153 9,0.5,9.5);
00154 hjan[15]= new gl3Histo ( "ppLMV15","my vertex in Z (cm)",
00155 50, -300, 300. ) ;
00156 hjan[16]= new gl3Histo ( "ppLMV16","my-ZDC vertex in Z (cm)",
00157 50, -20, 20. ) ;
00158 hjan[17]= new gl3Histo("ppLMV17","end: #DeltaZ (cm) (matched track-myVertex)",
00159 50, -5., 5. );
00160 hjan[18]= new gl3Histo("ppLMV18","#DeltaZ (cm) (matched track-myVertex), Nmatch=[2-5]",
00161 50, -5., 5. );
00162 hjan[19]= new gl3Histo("ppLMV19","#DeltaZ (cm) (matched track-myVertex), Nmatch=[6-10]",
00163 50, -5., 5. );
00164 hjan[20]= new gl3Histo("ppLMV20","#DeltaZ (cm) (matched track-myVertex), Nmatch=[10++]",
00165 50, -5., 5. );
00166 hjan[21]= new gl3Histo("ppLMV21","sigma of tracks extrapolated to vertex, a.u.",
00167 50,.0,10.);
00168
00169 nhjan=22;
00170
00171 if(lmvdbg) {
00172 for(int i=0;i<16;i++) {
00173 char t1[100], t2[100];
00174 sprintf(t1,"ppeve%d",i);
00175 sprintf(t2,"Zdca-Zvertex (cm) for accepted eve=%2d",i);
00176 heve[i]= new gl3Histo ( t1,t2, 50, -50., 50. );
00177 }
00178 }
00179
00180 neve=0;
00181
00182 return 0 ;
00183 }
00184
00185
00186
00187
00188
00189 int gl3LMVertexFinder::registerHistos() {
00190
00191 int j;
00192 for(j=0;j<nhjan;j++) gl3HistoManager::instance()->add(hjan[j]);
00193
00194 if(lmvdbg) for(j=0;j<16;j++) gl3HistoManager::instance()->add(heve[j]);
00195
00196 return 0;
00197 }
00198
00199
00200
00201
00202
00203 int gl3LMVertexFinder::makeVertex( gl3Event *event ) {
00204 int j;
00205
00206 totInpEve++;
00207 myVert.z=2001;
00208 myVert.x=2002;
00209 myVert.y=2003;
00210
00211 NtrackL=0;
00212
00213 memset(trackL,0,sizeof(trackL));
00214 hjan[13]->Fill(1);
00215 hjan[1]->Fill(event->getNTracks(),1);
00216
00217 if (event->getNTracks() > 5000)
00218 return 0;
00219
00220
00221 if( getCtbHits(event) <=0) return 0;
00222
00223 hjan[13]->Fill(2);
00224
00225
00226 hjan[13]->Fill(3);
00227
00228 float zVertexZDC=event->getZDCVertex();
00229
00230 hjan[0]->Fill(zVertexZDC);
00231 hjan[2]->Fill(event->getNTracks(),1);
00232
00233
00234
00235
00236
00237 for ( int trkcnt = 0 ; trkcnt < event->getNTracks() ; trkcnt++ ) {
00238 hjan[14]->Fill(1);
00239 gl3Track* gTrack = event->getTrack(trkcnt);
00240
00241 gTrack->flag=0;
00242
00243 hjan[3]->Fill(gTrack->nHits);
00244 if ( gTrack->nHits < minHitsOnTrack ) continue ;
00245
00246 hjan[14]->Fill(2);
00247
00248
00249 Ftf3DHit dcaHit1=gTrack->closestApproach ( 0., 0. ) ;
00250 float zDCA = dcaHit1.z ;
00251
00252
00253
00254
00255 if(fabs(zDCA)>maxZdca) continue;
00256
00257 hjan[14]->Fill(3);
00258
00259 if(minCTBadc>=0) {
00260 Ftf3DHit hit=gTrack->extraRadius(CtbRadius);
00261 if(fabs(hit.x)<0.1 && fabs(hit.y)<0.1) continue;
00262
00263 hjan[14]->Fill(4);
00264 if( matchTrack2Ctb(&hit) <0) continue;
00265
00266 hjan[14]->Fill(5);
00267 } else {
00268 hjan[14]->Fill(6);
00269 }
00270
00271 if(lmvdbg) printf("track DCA x=%f y=%f z=%f\n",dcaHit1.x, dcaHit1.y,dcaHit1.z );
00272
00273
00274 if(NtrackL>= MAXTRACK) {
00275 LOG(ERR, " PileupFilter WARN: %d=NtrackL>= MAXTRACK, skip this matched track\n",NtrackL,0,0,0,0);
00276 continue;
00277 }
00278 trackL[NtrackL]=gTrack;
00279 XdcaHitL[NtrackL]=dcaHit1.x;
00280 YdcaHitL[NtrackL]=dcaHit1.y;
00281 ZdcaHitL[NtrackL]=dcaHit1.z;
00282 NtrackL++;
00283
00284 hjan[4]->Fill(zDCA);
00285 hjan[5]->Fill(zDCA-zVertexZDC);
00286 }
00287
00288 neve++;
00289 hjan[11]->Fill(NtrackL);
00290
00291 if(lmvdbg) printf(" - end of eve: accepted tracks=%d, ZDCvert=%f.1 (neve=%d)\n",NtrackL,zVertexZDC,neve);
00292
00293
00294 gl3Track beamTrack;
00295 beamTrack.r0=0;
00296 beamTrack.phi0=0;
00297 beamTrack.z0=0;
00298 beamTrack.tanl=888999.;
00299 beamTrack.psi=0;
00300 beamTrack.id=888999;
00301 beamTrack.lastHit=0;
00302
00303 trackL[NtrackL]=&beamTrack;
00304 XdcaHitL[NtrackL]=0.;
00305 YdcaHitL[NtrackL]=0.;
00306 ZdcaHitL[NtrackL]=0.;
00307 NtrackL++;
00308
00309 if(NtrackL<2) return 0;
00310
00311 hjan[13]->Fill(4);
00312
00313
00314 int NtrackVertex=ppLMV4b(&myVert);
00315 if( NtrackVertex <2) return 0;
00316
00317
00318
00319
00320
00321
00322 hjan[13]->Fill(5);
00323 hjan[15]->Fill(myVert.z);
00324 hjan[16]->Fill(myVert.z-zVertexZDC);
00325
00326
00327 for( j=0;j<NtrackL;j++) {
00328 if( trackL[j]==NULL) continue;
00329 if(trackL[j]->lastHit==NULL) continue;
00330 float zVer = ZdcaHitL[j] ;
00331 hjan[17]->Fill(zVer-myVert.z);
00332 if(lmvdbg && neve<16) heve[neve]->Fill(zVer-myVert.z);
00333 }
00334
00335
00336 for( j=0;j<NtrackL;j++) {
00337 if( trackL[j]==NULL) continue;
00338 if(trackL[j]->lastHit==NULL) continue;
00339 float zDca = ZdcaHitL[j] ;
00340 hjan[17]->Fill(zDca-myVert.z);
00341 if( NtrackVertex <=5 ) hjan[18]->Fill(zDca-myVert.z);
00342 else if( NtrackVertex <=10 ) hjan[19]->Fill(zDca-myVert.z);
00343 else hjan[20]->Fill(zDca-myVert.z);
00344 }
00345
00346
00347 if (NtrackVertex<2)
00348 return 0;
00349 else
00350 return 1;
00351 }
00352
00353
00354
00355
00356
00357
00358
00359
00360
00361
00362 int gl3LMVertexFinder::getCtbHits (gl3Event *event) {
00363
00364 memset(ctbH,0,sizeof(ctbH));
00365 NctbH=0;
00366
00367 int nSlat=0;
00368
00369 float phiZero1 = 72 ;
00370 float phiZero2 = 108 ;
00371 float deltaPhi = 6 ;
00372
00373 for(int ss=0;ss<2;ss++) {
00374 for(int tt=0;tt<120;tt++) {
00375 int indx=ctbMap[tt][ss];
00376 if(indx<0||indx>255) {
00377
00378 continue ;
00379 }
00380 int ctbAdc =event->getCTB(indx);
00381
00382
00383 if(ctbAdc)hjan[6]->Fill(ctbAdc);
00384
00385 if(ctbAdc< minCTBadc) continue;
00386
00387 int iz ;
00388 float phi ;
00389
00390 if ( tt < 60 ) {
00391 phi = phiZero1 - tt * deltaPhi ;
00392 iz = 0 ;
00393 } else {
00394 phi = phiZero2 + (tt-60) * deltaPhi ;
00395 iz = 1 ;
00396 }
00397 if ( phi < 0. ) phi += 360 ;
00398 if ( phi > 360. ) phi -= 360 ;
00399
00400
00401
00402
00403
00404
00405 if(nSlat>= MAXSLATS) {
00406 if(lmvdbg)
00407 printf(" PileupFilter WARN: %d=nSlat>= MAXSLATS,nSlat, skip this CTB hit\n",nSlat);
00408 continue;
00409 }
00410
00411 ctbH[nSlat].z= zSlats[iz][ss];
00412 ctbH[nSlat].phi=phi/180*C_PI;
00413 ctbH[nSlat].adc=ctbAdc;
00414 ctbH[nSlat].slatIndex=indx;
00415
00416 hjan[7]->Fill(tt+120*ss);
00417 hjan[8]->Fill(ctbH[nSlat].z);
00418 nSlat++;
00419 }
00420 }
00421 if(lmvdbg) printf(" %d CTB slats with ADC>=%d\n",nSlat,minCTBadc);
00422 NctbH=nSlat;
00423 hjan[12]->Fill(NctbH);
00424 return NctbH;
00425 }
00426
00427
00428
00429
00430 int gl3LMVertexFinder::matchTrack2Ctb( Ftf3DHit * h) {
00431 assert(h);
00432
00433 float phi=atan2(h->y,h->x);
00434 if(phi<0) phi+=2*C_PI;
00435
00436 for(int is=0;is<NctbH;is++) {
00437
00438 float del_z=h->z-ctbH[is].z;
00439 if(fabs(del_z) >MatchCtbMaxZ) continue;
00440
00441 float del_phi=phi-ctbH[is].phi;
00442 if(del_phi>C_PI) del_phi-=2*C_PI;
00443 if(del_phi<-C_PI) del_phi+=2*C_PI;
00444
00445
00446
00447 if(fabs(del_phi) >MatchCtbMaxPhi) continue;
00448
00449 hjan[9]->Fill(del_phi/C_PI*180.);
00450 hjan[10]->Fill(del_z);
00451
00452 return is;
00453 }
00454
00455 return -1 ;
00456 }
00457
00458
00459
00460
00461 int gl3LMVertexFinder::ppLMV4b ( Ftf3DHit *myV) {
00462
00463 myV->x=1000;
00464 myV->y=1001;
00465 myV->z=1002;
00466 int NtrackUsed=NtrackL;
00467
00468
00469 double A11=0.0,A12=0.0,A13=0.0,A21=0.0,A22=0.0,A23=0.0;
00470 double A31=0.0,A32=0.0,A33=0.0;
00471 double C11=0.0,C12=0.0,C13=0.0,C21=0.0,C22=0.0,C23=0.0;
00472 double C31=0.0,C32=0.0,C33=0.0;
00473 int done = 0;
00474 double chi2=0;
00475
00476 while( done != 1 ){
00477
00478
00479 if( NtrackUsed <= 1 ){
00480 if(lmvdbg)cout<<"ppLMV4b: Fewer than 2 track remains. No vertex found."<<endl;
00481 return -1;
00482 }
00483
00484
00485 A11=0.0,A12=0.0,A13=0.0,A21=0.0,A22=0.0,A23=0.0;
00486 A31=0.0,A32=0.0,A33=0.0;
00487 C11=0.0,C12=0.0,C13=0.0,C21=0.0,C22=0.0,C23=0.0;
00488 C31=0.0,C32=0.0,C33=0.0;
00489 double b1=0.0,b2=0.0,b3=0.0;
00490
00491 int itr;
00492 for(itr=0; itr < NtrackL; itr++){
00493
00494 gl3Track *trk=trackL[itr];
00495 if(trk==NULL) continue;
00496 double xp=XdcaHitL[itr];
00497 double yp=YdcaHitL[itr];
00498 double zp=ZdcaHitL[itr];
00499
00500 double mag=sqrt(1+trk->tanl*trk->tanl);
00501 double xhat=cos(trk->psi)/mag;
00502 double yhat=sin(trk->psi)/mag;
00503 double zhat=trk->tanl/mag;
00504
00505
00506
00507
00508
00509
00510
00511
00512
00513
00514
00515 double sigma=1;
00516 gl3Hit *h=(gl3Hit *)trk->lastHit;
00517 if(h) {
00518 float Rxy=sqrt(h->getX()*h->getX() + h->getY()*h->getY());
00519 float pmom =trk->pt*mag;
00520 float beta= pmom/sqrt(pmom*pmom+ 0.139*0.139);
00521 sigma=0.0136 *Rxy/beta/trk->pt;
00522 } else {
00523 if(trk->id==888999 && trk->tanl>88899.) sigma=0.5;
00524 }
00525
00526 hjan[21]->Fill(sigma);
00527
00528 A11=A11+(yhat*yhat+zhat*zhat)/sigma;
00529 A12=A12-(xhat*yhat)/sigma;
00530 A13=A13-(xhat*zhat)/sigma;
00531 A22=A22+(xhat*xhat+zhat*zhat)/sigma;
00532 A23=A23-(yhat*zhat)/sigma;
00533 A33=A33+(xhat*xhat+yhat*yhat)/sigma;
00534 b1=b1 + ( (yhat*yhat+zhat*zhat)*xp - xhat*yhat*yp - xhat*zhat*zp )/sigma;
00535 b2=b2 + ( (xhat*xhat+zhat*zhat)*yp - xhat*yhat*xp - yhat*zhat*zp )/sigma;
00536 b3=b3 + ( (xhat*xhat+yhat*yhat)*zp - xhat*zhat*xp - yhat*zhat*yp )/sigma;
00537 }
00538
00539 A21 = A12; A31=A13; A32=A23;
00540
00541
00542 double detA = A11*A22*A33 + A12*A23*A31 + A13*A21*A32;
00543 detA = detA - A31*A22*A13 - A32*A23*A11 - A33*A21*A12;
00544
00545
00546
00547
00548
00549 C11=(A22*A33-A23*A32)/detA; C12=(A13*A32-A12*A33)/detA; C13=(A12*A23-A13*A22)/detA;
00550 C21=C12; C22=(A11*A33-A13*A31)/detA; C23=(A13*A21-A11*A23)/detA;
00551 C31=C13; C32=C23; C33=(A11*A22-A12*A21)/detA;
00552
00553
00554 double Xv = C11*b1 + C12*b2 + C13*b3;
00555 double Yv = C21*b1 + C22*b2 + C23*b3;
00556 double Zv = C31*b1 + C32*b2 + C33*b3;
00557
00558 if(lmvdbg) {
00559 cout<<"current Vertex Position : "<<Xv<<" "<<Yv<<" "<<Zv<<" nTR used="<<NtrackUsed<<endl;
00560 cout<<" Vertex Error : "<<sqrt(C11)<<" "<<sqrt(C22)<<" "<<sqrt(C33)<<endl;
00561 }
00562
00563
00564
00565 double dmax=0.0;
00566 int iworse=-1;
00567
00568 for(itr=0; itr < NtrackL; itr++){
00569 gl3Track *trk=trackL[itr];
00570 if(trk==NULL) continue;
00571 if(trk->lastHit==NULL) continue;
00572
00573 double xp=XdcaHitL[itr];
00574 double yp=YdcaHitL[itr];
00575 double zp=ZdcaHitL[itr];
00576
00577 if(lmvdbg) printf("itr=%d, Zdca=%f Zvert=%f\n",itr,zp,Zv);
00578 double d2=(xp-Xv)*(xp-Xv) +(yp-Yv)*(yp-Yv) +(zp-Zv)*(zp-Zv);
00579 double d=sqrt(d2);
00580 double sig=1;
00581 chi2 = chi2 + d2/(sig*sig);
00582 double drel = d/sig;
00583 if(lmvdbg) printf(" itr=%d, drel/sig=%f d=%f/sig sig=%f\n",itr,drel,d, sig);
00584 if( drel > dmax ){
00585
00586 dmax = drel;
00587 iworse = itr;
00588 }
00589 }
00590
00591 if( dmax > DelVertMax ){
00592 if(lmvdbg) cout<<"Removing a track "<<iworse<< " with dmax= "<<dmax<<endl;
00593 trackL[iworse]=NULL;
00594 NtrackUsed--;
00595 done=0;
00596 }
00597 else{
00598 done=1;
00599 myV->x=Xv;
00600 myV->y=Yv;
00601 myV->z=Zv;
00602 }
00603 }
00604
00605
00606 if(lmvdbg) {
00607 cout << "ppLMV4b: Primary Vertex found: used tracks="
00608 << NtrackUsed << " out of " << NtrackL << " matched and "
00609 << " L3-tracks" << endl
00610 <<" at Position : " << myV->x << " " << myV->y << " "
00611 << myV->z << endl;
00612 }
00613
00614 for(int itr=0; itr < NtrackL; itr++){
00615 gl3Track *trk=trackL[itr];
00616 if(trk==NULL) continue;
00617 trk->flag+=0x2;
00618 }
00619
00620 return NtrackUsed;
00621 }
00622
00623
00624
00625
00626
00627
00628 void gl3LMVertexFinder::setCtbMap() {
00629 ctbMap[1-1][1-1]=109;
00630 ctbMap[2-1][1-1]=108;
00631 ctbMap[3-1][1-1]=107;
00632 ctbMap[4-1][1-1]=106;
00633 ctbMap[5-1][1-1]=105;
00634 ctbMap[6-1][1-1]=7;
00635 ctbMap[7-1][1-1]=6;
00636 ctbMap[8-1][1-1]=5;
00637 ctbMap[9-1][1-1]=4;
00638 ctbMap[10-1][1-1]=3;
00639 ctbMap[11-1][1-1]=2;
00640 ctbMap[12-1][1-1]=1;
00641 ctbMap[13-1][1-1]=0;
00642 ctbMap[14-1][1-1]=15;
00643 ctbMap[15-1][1-1]=14;
00644 ctbMap[16-1][1-1]=13;
00645 ctbMap[17-1][1-1]=12;
00646 ctbMap[18-1][1-1]=11;
00647 ctbMap[19-1][1-1]=10;
00648 ctbMap[20-1][1-1]=9;
00649 ctbMap[21-1][1-1]=39;
00650 ctbMap[22-1][1-1]=38;
00651 ctbMap[23-1][1-1]=37;
00652 ctbMap[24-1][1-1]=36;
00653 ctbMap[25-1][1-1]=35;
00654 ctbMap[26-1][1-1]=34;
00655 ctbMap[27-1][1-1]=33;
00656 ctbMap[28-1][1-1]=32;
00657 ctbMap[29-1][1-1]=47;
00658 ctbMap[30-1][1-1]=46;
00659 ctbMap[31-1][1-1]=45;
00660 ctbMap[32-1][1-1]=44;
00661 ctbMap[33-1][1-1]=43;
00662 ctbMap[34-1][1-1]=42;
00663 ctbMap[35-1][1-1]=41;
00664 ctbMap[36-1][1-1]=71;
00665 ctbMap[37-1][1-1]=70;
00666 ctbMap[38-1][1-1]=69;
00667 ctbMap[39-1][1-1]=68;
00668 ctbMap[40-1][1-1]=67;
00669 ctbMap[41-1][1-1]=66;
00670 ctbMap[42-1][1-1]=65;
00671 ctbMap[43-1][1-1]=64;
00672 ctbMap[44-1][1-1]=79;
00673 ctbMap[45-1][1-1]=78;
00674 ctbMap[46-1][1-1]=77;
00675 ctbMap[47-1][1-1]=76;
00676 ctbMap[48-1][1-1]=75;
00677 ctbMap[49-1][1-1]=74;
00678 ctbMap[50-1][1-1]=73;
00679 ctbMap[51-1][1-1]=103;
00680 ctbMap[52-1][1-1]=102;
00681 ctbMap[53-1][1-1]=101;
00682 ctbMap[54-1][1-1]=100;
00683 ctbMap[55-1][1-1]=99;
00684 ctbMap[56-1][1-1]=98;
00685 ctbMap[57-1][1-1]=97;
00686 ctbMap[58-1][1-1]=96;
00687 ctbMap[59-1][1-1]=111;
00688 ctbMap[60-1][1-1]=110;
00689 ctbMap[1-1][2-1]=125;
00690 ctbMap[2-1][2-1]=124;
00691 ctbMap[3-1][2-1]=123;
00692 ctbMap[4-1][2-1]=122;
00693 ctbMap[5-1][2-1]=121;
00694 ctbMap[6-1][2-1]=23;
00695 ctbMap[7-1][2-1]=22;
00696 ctbMap[8-1][2-1]=21;
00697 ctbMap[9-1][2-1]=20;
00698 ctbMap[10-1][2-1]=19;
00699 ctbMap[11-1][2-1]=18;
00700 ctbMap[12-1][2-1]=17;
00701 ctbMap[13-1][2-1]=16;
00702 ctbMap[14-1][2-1]=31;
00703 ctbMap[15-1][2-1]=30;
00704 ctbMap[16-1][2-1]=29;
00705 ctbMap[17-1][2-1]=28;
00706 ctbMap[18-1][2-1]=27;
00707 ctbMap[19-1][2-1]=26;
00708 ctbMap[20-1][2-1]=25;
00709 ctbMap[21-1][2-1]=55;
00710 ctbMap[22-1][2-1]=54;
00711 ctbMap[23-1][2-1]=53;
00712 ctbMap[24-1][2-1]=52;
00713 ctbMap[25-1][2-1]=51;
00714 ctbMap[26-1][2-1]=50;
00715 ctbMap[27-1][2-1]=49;
00716 ctbMap[28-1][2-1]=48;
00717 ctbMap[29-1][2-1]=63;
00718 ctbMap[30-1][2-1]=62;
00719 ctbMap[31-1][2-1]=61;
00720 ctbMap[32-1][2-1]=60;
00721 ctbMap[33-1][2-1]=59;
00722 ctbMap[34-1][2-1]=58;
00723 ctbMap[35-1][2-1]=57;
00724 ctbMap[36-1][2-1]=87;
00725 ctbMap[37-1][2-1]=86;
00726 ctbMap[38-1][2-1]=85;
00727 ctbMap[39-1][2-1]=84;
00728 ctbMap[40-1][2-1]=83;
00729 ctbMap[41-1][2-1]=82;
00730 ctbMap[42-1][2-1]=81;
00731 ctbMap[43-1][2-1]=80;
00732 ctbMap[44-1][2-1]=95;
00733 ctbMap[45-1][2-1]=94;
00734 ctbMap[46-1][2-1]=93;
00735 ctbMap[47-1][2-1]=92;
00736 ctbMap[48-1][2-1]=91;
00737 ctbMap[49-1][2-1]=90;
00738 ctbMap[50-1][2-1]=89;
00739 ctbMap[51-1][2-1]=119;
00740 ctbMap[52-1][2-1]=118;
00741 ctbMap[53-1][2-1]=117;
00742 ctbMap[54-1][2-1]=116;
00743 ctbMap[55-1][2-1]=115;
00744 ctbMap[56-1][2-1]=114;
00745 ctbMap[57-1][2-1]=113;
00746 ctbMap[58-1][2-1]=112;
00747 ctbMap[59-1][2-1]=127;
00748 ctbMap[60-1][2-1]=126;
00749 ctbMap[61-1][1-1]=141;
00750 ctbMap[62-1][1-1]=140;
00751 ctbMap[63-1][1-1]=139;
00752 ctbMap[64-1][1-1]=138;
00753 ctbMap[65-1][1-1]=137;
00754 ctbMap[66-1][1-1]=167;
00755 ctbMap[67-1][1-1]=166;
00756 ctbMap[68-1][1-1]=165;
00757 ctbMap[69-1][1-1]=164;
00758 ctbMap[70-1][1-1]=163;
00759 ctbMap[71-1][1-1]=162;
00760 ctbMap[72-1][1-1]=161;
00761 ctbMap[73-1][1-1]=160;
00762 ctbMap[74-1][1-1]=175;
00763 ctbMap[75-1][1-1]=174;
00764 ctbMap[76-1][1-1]=173;
00765 ctbMap[77-1][1-1]=172;
00766 ctbMap[78-1][1-1]=171;
00767 ctbMap[79-1][1-1]=170;
00768 ctbMap[80-1][1-1]=169;
00769 ctbMap[81-1][1-1]=199;
00770 ctbMap[82-1][1-1]=198;
00771 ctbMap[83-1][1-1]=197;
00772 ctbMap[84-1][1-1]=196;
00773 ctbMap[85-1][1-1]=195;
00774 ctbMap[86-1][1-1]=194;
00775 ctbMap[87-1][1-1]=193;
00776 ctbMap[88-1][1-1]=192;
00777 ctbMap[89-1][1-1]=207;
00778 ctbMap[90-1][1-1]=206;
00779 ctbMap[91-1][1-1]=205;
00780 ctbMap[92-1][1-1]=204;
00781 ctbMap[93-1][1-1]=203;
00782 ctbMap[94-1][1-1]=202;
00783 ctbMap[95-1][1-1]=201;
00784 ctbMap[96-1][1-1]=231;
00785 ctbMap[97-1][1-1]=230;
00786 ctbMap[98-1][1-1]=229;
00787 ctbMap[99-1][1-1]=228;
00788 ctbMap[100-1][1-1]=227;
00789 ctbMap[101-1][1-1]=226;
00790 ctbMap[102-1][1-1]=225;
00791 ctbMap[103-1][1-1]=224;
00792 ctbMap[104-1][1-1]=239;
00793 ctbMap[105-1][1-1]=239;
00794 ctbMap[106-1][1-1]=237;
00795 ctbMap[107-1][1-1]=236;
00796 ctbMap[108-1][1-1]=235;
00797 ctbMap[109-1][1-1]=234;
00798 ctbMap[110-1][1-1]=233;
00799 ctbMap[111-1][1-1]=135;
00800 ctbMap[112-1][1-1]=134;
00801 ctbMap[113-1][1-1]=133;
00802 ctbMap[114-1][1-1]=132;
00803 ctbMap[115-1][1-1]=131;
00804 ctbMap[116-1][1-1]=130;
00805 ctbMap[117-1][1-1]=129;
00806 ctbMap[118-1][1-1]=128;
00807 ctbMap[119-1][1-1]=143;
00808 ctbMap[120-1][1-1]=142;
00809 ctbMap[61-1][2-1]=157;
00810 ctbMap[62-1][2-1]=156;
00811 ctbMap[63-1][2-1]=155;
00812 ctbMap[64-1][2-1]=154;
00813 ctbMap[65-1][2-1]=153;
00814 ctbMap[66-1][2-1]=183;
00815 ctbMap[67-1][2-1]=182;
00816 ctbMap[68-1][2-1]=181;
00817 ctbMap[69-1][2-1]=180;
00818 ctbMap[70-1][2-1]=179;
00819 ctbMap[71-1][2-1]=178;
00820 ctbMap[72-1][2-1]=177;
00821 ctbMap[73-1][2-1]=176;
00822 ctbMap[74-1][2-1]=191;
00823 ctbMap[75-1][2-1]=190;
00824 ctbMap[76-1][2-1]=189;
00825 ctbMap[77-1][2-1]=188;
00826 ctbMap[78-1][2-1]=187;
00827 ctbMap[79-1][2-1]=186;
00828 ctbMap[80-1][2-1]=185;
00829 ctbMap[81-1][2-1]=215;
00830 ctbMap[82-1][2-1]=214;
00831 ctbMap[83-1][2-1]=213;
00832 ctbMap[84-1][2-1]=212;
00833 ctbMap[85-1][2-1]=211;
00834 ctbMap[86-1][2-1]=210;
00835 ctbMap[87-1][2-1]=209;
00836 ctbMap[88-1][2-1]=208;
00837 ctbMap[89-1][2-1]=223;
00838 ctbMap[90-1][2-1]=222;
00839 ctbMap[91-1][2-1]=221;
00840 ctbMap[92-1][2-1]=220;
00841 ctbMap[93-1][2-1]=219;
00842 ctbMap[94-1][2-1]=218;
00843 ctbMap[95-1][2-1]=217;
00844 ctbMap[96-1][2-1]=247;
00845 ctbMap[97-1][2-1]=246;
00846 ctbMap[98-1][2-1]=245;
00847 ctbMap[99-1][2-1]=244;
00848 ctbMap[100-1][2-1]=243;
00849 ctbMap[101-1][2-1]=242;
00850 ctbMap[102-1][2-1]=241;
00851 ctbMap[103-1][2-1]=240;
00852 ctbMap[104-1][2-1]=255;
00853 ctbMap[105-1][2-1]=254;
00854 ctbMap[106-1][2-1]=253;
00855 ctbMap[107-1][2-1]=252;
00856 ctbMap[108-1][2-1]=251;
00857 ctbMap[109-1][2-1]=250;
00858 ctbMap[110-1][2-1]=249;
00859 ctbMap[111-1][2-1]=151;
00860 ctbMap[112-1][2-1]=150;
00861 ctbMap[113-1][2-1]=149;
00862 ctbMap[114-1][2-1]=148;
00863 ctbMap[115-1][2-1]=147;
00864 ctbMap[116-1][2-1]=146;
00865 ctbMap[117-1][2-1]=145;
00866 ctbMap[118-1][2-1]=144;
00867 ctbMap[119-1][2-1]=159;
00868 ctbMap[120-1][2-1]=158;
00869
00870 zSlats[0][0] = 64;;
00871 zSlats[0][1] = 191. ;
00872 zSlats[1][0] = -64.;
00873 zSlats[1][1] = -191.;
00874
00875
00876 #ifdef GL3ROOT
00877 printf("the Ctb Map from Pablo from herb is set\n");
00878 #endif
00879 return ;
00880 }
00881
00882
00883