33 SectorRmin1 = 489.27 * mm;
34 SectorRmax1 = 880. * mm;
35 SectorRmin2 = 621.57 * mm;
36 SectorRmax2 = 1113.53 * mm;
37 SectorDz = WorldDz - 44. * mm;
38 SectorZPosition = -18. * mm;
40 for ( G4int i = 0; i < 6; i++ ) cryNumInOneLayer[i] = emcPara.
GetCryInOneLayer( i );
46 totalThickness = fTyvekThickness + fAlThickness + fMylarThickness;
48 G4String ParaPath = getenv(
"EMCSIMROOT" );
51 G4cout <<
"BOOST environment not set!" << G4endl;
54 ParaPath +=
"/dat/EmcEndGeometry.dat";
59 for ( G4int i = 0; i < 30; i++ )
60 for ( G4int j = 0; j < 24; j++ ) fin >> param[i][j];
61 for ( G4int i = 0; i < 5; i++ )
62 for ( G4int j = 0; j < 6; j++ ) fin >> penta[i][j];
91 for ( G4int i = 0; i < 30; i++ )
93 for ( G4int j = 0; j < 8; j++ )
96 G4ThreeVector* pPnt =
new G4ThreeVector(
97 param[i][j], param[i][j + 8], param[i][j + 16] - WorldZPosition - SectorZPosition );
101 if ( i == 5 || i == 6 || i == 14 || i == 15 || i == 16 )
104 for ( G4int j = 0; j < 8; j++ ) fPnt[30 + pentaNb][j] = fPnt[i][j];
107 G4double y0, y1, y4, y5;
108 G4ThreeVector v0, v1, v4, v5;
109 y0 = penta[pentaNb][0];
110 y1 = penta[pentaNb][1];
111 y4 = penta[pentaNb][2];
112 y5 = penta[pentaNb][3];
113 v0 = ( y0 - fPnt[i][3].getY() ) * ( fPnt[i][0] - fPnt[i][3] ) /
114 ( fPnt[i][0].getY() - fPnt[i][3].getY() ) +
116 v1 = ( y1 - fPnt[i][2].getY() ) * ( fPnt[i][1] - fPnt[i][2] ) /
117 ( fPnt[i][1].getY() - fPnt[i][2].getY() ) +
119 v4 = ( y4 - fPnt[i][7].getY() ) * ( fPnt[i][4] - fPnt[i][7] ) /
120 ( fPnt[i][4].getY() - fPnt[i][7].getY() ) +
122 v5 = ( y5 - fPnt[i][6].getY() ) * ( fPnt[i][5] - fPnt[i][6] ) /
123 ( fPnt[i][5].getY() - fPnt[i][6].getY() ) +
127 x1 = penta[pentaNb][4];
128 x5 = penta[pentaNb][5];
129 v1 = ( x1 - v0.getX() ) * ( v1 - v0 ) / ( v1.getX() - v0.getX() ) +
131 v5 = ( x5 - v4.getX() ) * ( v5 - v4 ) / ( v5.getX() - v4.getX() ) + v4;
138 fPnt[30 + pentaNb][2] = v1;
139 fPnt[30 + pentaNb][3] = v0;
140 fPnt[30 + pentaNb][6] = v5;
141 fPnt[30 + pentaNb][7] = v4;
148 G4ThreeVector temp[35][8];
149 for ( G4int i = 0; i < 35; i++ )
151 for ( G4int j = 0; j < 8; j++ )
153 temp[i][j] = fPnt[i][j];
154 fPnt[i][j].rotateZ( 157.5 * deg );
155 fPnt[i][j].setX( -fPnt[i][j].getX() );
159 for ( G4int j = 0; j < 8; j++ )
163 G4ThreeVector
v = fPnt[i][j];
164 fPnt[i][j] = fPnt[i][3 - j];
167 else if ( j >= 4 && j < 6 )
169 G4ThreeVector
v = fPnt[i][j];
170 fPnt[i][j] = fPnt[i][11 - j];
208 for ( G4int i = 0; i < 35; i++ )
210 for ( G4int j = 0; j < 8; j++ )
212 G4ThreeVector pPnt1 = temp[i][j];
213 fPnt1[i][j] = pPnt1.rotateZ( 67.5 * deg );
215 if ( ( i == 3 ) || ( i == 7 ) || ( i == 12 ) || ( i == 17 ) || ( i == 23 ) || ( i == 29 ) )
217 fPnt1[i][0].setX( 10 );
218 fPnt1[i][1].setX( 10 );
219 fPnt1[i][4].setX( 10 );
220 fPnt1[i][5].setX( 10 );
222 G4double y0 = fPnt1[i][0].getY() +
223 10 * ( fPnt1[i][3].getY() - fPnt1[i][0].getY() ) / fPnt1[i][3].getX();
224 G4double y1 = fPnt1[i][1].getY() +
225 10 * ( fPnt1[i][2].getY() - fPnt1[i][1].getY() ) / fPnt1[i][2].getX();
226 G4double y4 = fPnt1[i][4].getY() +
227 10 * ( fPnt1[i][7].getY() - fPnt1[i][4].getY() ) / fPnt1[i][7].getX();
228 G4double y5 = fPnt1[i][5].getY() +
229 10 * ( fPnt1[i][6].getY() - fPnt1[i][5].getY() ) / fPnt1[i][6].getX();
231 G4double z0 = fPnt1[i][0].getZ() +
232 10 * ( fPnt1[i][3].getZ() - fPnt1[i][0].getZ() ) / fPnt1[i][3].getX();
233 G4double z1 = fPnt1[i][1].getZ() +
234 10 * ( fPnt1[i][2].getZ() - fPnt1[i][1].getZ() ) / fPnt1[i][2].getX();
235 G4double z4 = fPnt1[i][4].getZ() +
236 10 * ( fPnt1[i][7].getZ() - fPnt1[i][4].getZ() ) / fPnt1[i][7].getX();
237 G4double z5 = fPnt1[i][5].getZ() +
238 10 * ( fPnt1[i][6].getZ() - fPnt1[i][5].getZ() ) / fPnt1[i][6].getX();
240 fPnt1[i][0].setY( y0 );
241 fPnt1[i][1].setY( y1 );
242 fPnt1[i][4].setY( y4 );
243 fPnt1[i][5].setY( y5 );
245 fPnt1[i][0].setZ( z0 );
246 fPnt1[i][1].setZ( z1 );
247 fPnt1[i][4].setZ( z4 );
248 fPnt1[i][5].setZ( z5 );
328 G4ThreeVector center1( 0, 0, 0 );
329 G4ThreeVector center2( 0, 0, 0 );
330 for ( G4int i = 0; i < 8; i++ ) zoomPoint[i] = G4ThreeVector( 0, 0, 0 );
332 for ( G4int i = 0; i < 8; i++ )
334 if ( i < 4 ) center1 += pos[i];
335 else center2 += pos[i];
340 for ( G4int i = 0; i < 8; i++ )
342 if ( i < 4 ) zoomPoint[i] = factor * pos[i] + ( 1 - factor ) * center1;
343 else zoomPoint[i] = factor * pos[i] + ( 1 - factor ) * center2;
349 G4ThreeVector center1( 0, 0, 0 );
350 G4ThreeVector center2( 0, 0, 0 );
352 const G4double
dt = 1e-5;
354 if ( CryNb == 5 || CryNb == 6 || CryNb == 14 || CryNb == 15 || CryNb == 16 )
356 center1 = ( pos[0] + pos[1] ) * ( 1 -
dt ) / 2 + ( pos[2] + pos[3] ) *
dt / 2;
357 center2 = ( pos[4] + pos[5] ) * ( 1 -
dt ) / 2 + ( pos[6] + pos[7] ) *
dt / 2;
359 else if ( CryNb >= 30 && CryNb < 35 )
361 center1 = ( pos[0] + pos[1] ) *
dt / 2 + ( pos[2] + pos[3] ) * ( 1 -
dt ) / 2;
362 center2 = ( pos[4] + pos[5] ) *
dt / 2 + ( pos[6] + pos[7] ) * ( 1 -
dt ) / 2;
366 center1 = ( pos[0] + pos[1] + pos[2] + pos[3] ) / 4;
367 center2 = ( pos[4] + pos[5] + pos[6] + pos[7] ) / 4;
370 G4double r1 = ( pos[1] - center1 ).r();
371 G4double r2 = ( pos[2] - center1 ).r();
372 G4double r12 = ( pos[1] - pos[2] ).r();
373 G4double theta = acos( ( r2 * r2 + r12 * r12 - r1 * r1 ) / ( 2 * r2 * r12 ) );
374 G4double h = r2 *
sin( theta );
375 G4double t1 = totalThickness / h;
377 r1 = ( pos[5] - center2 ).r();
378 r2 = ( pos[6] - center2 ).r();
379 r12 = ( pos[5] - pos[6] ).r();
380 theta = acos( ( r2 * r2 + r12 * r12 - r1 * r1 ) / ( 2 * r2 * r12 ) );
381 h = r2 *
sin( theta );
382 G4double t2 = totalThickness / h;
384 for ( G4int i = 0; i < 8; i++ )
386 if ( i < 4 ) { cryPoint[i] = ( 1 - t1 ) * pos[i] + t1 * center1; }
389 G4ThreeVector temp = ( 1 - t2 ) * pos[i] + t2 * center2;
390 cryPoint[i] = ( 1 - totalThickness / CrystalLength ) * temp +
391 ( totalThickness / CrystalLength ) * pos[i - 4];
398 const G4int numPhi ) {
400 G4int sector = -1, cryNb = -1;
405 G4double A1 = 0, a1 = 0, B1 = 0, b1 = 0, C1 = 0, c1 = 0, D1 = 0, d1 = 0, E1 = 0,
408 G4ThreeVector position( 0, 0, 0 );
409 G4int cryInOneSector =
410 cryNumInOneLayer[numTheta] / 16;
411 G4ThreeVector pos[8];
415 if ( numPhi >= 0 && numPhi < 8 * cryInOneSector )
416 m_numPhi = 8 * cryInOneSector - 1 - numPhi;
417 else if ( numPhi >= 8 * cryInOneSector && numPhi < 16 * cryInOneSector )
418 m_numPhi = 16 * cryInOneSector - 1 - numPhi;
423 if ( numPhi >= 4 * cryInOneSector && numPhi < 5 * cryInOneSector )
426 m_numPhi = 8 * cryInOneSector - 1 - numPhi;
428 else if ( numPhi >= 11 * cryInOneSector && numPhi < 12 * cryInOneSector )
433 m_numPhi = numPhi - 8 * cryInOneSector;
435 if ( numPhi >= 12 * cryInOneSector && numPhi < 13 * cryInOneSector )
439 m_numPhi = 16 * cryInOneSector - 1 - numPhi;
443 G4int cryNbOffset = 0;
444 for ( G4int i = 0; i < numTheta; i++ ) cryNbOffset += cryNumInOneLayer[i] / 16;
445 if ( cryInOneSector ) sector = m_numPhi / cryInOneSector;
446 cryNb = m_numPhi - cryInOneSector * sector + cryNbOffset;
448 if ( sector > 15 && sector <= 18 ) sector -= 16;
452 for ( G4int i = 0; i < 8; i++ ) pos[i] = fPnt1[cryNb][i];
454 for ( G4int i = 0; i < 8; i++ )
456 pos[i] = fPnt[cryNb][i];
457 pos[i].rotateZ( -67.5 * deg + sector * 22.5 * deg );
463 G4double A = ( cryPoint[0] - cryPoint[3] ).r();
464 G4double a = ( cryPoint[4] - cryPoint[7] ).r();
465 G4double B = ( cryPoint[1] - cryPoint[2] ).r();
466 G4double b = ( cryPoint[5] - cryPoint[6] ).r();
467 G4double
C = ( cryPoint[0] - cryPoint[1] ).r();
468 G4double c = ( cryPoint[4] - cryPoint[5] ).r();
469 G4double D = ( cryPoint[2] - cryPoint[3] ).r();
470 G4double d = ( cryPoint[6] - cryPoint[7] ).r();
473 for ( G4int i = 0; i < 8; i++ )
475 pos[i].setZ( pos[i].getZ() + WorldZPosition + SectorZPosition );
477 if ( leftFlag == 1 ) pos[i].setX( -pos[i].getX() );
478 if ( downFlag == 1 ) pos[i].setY( -pos[i].getY() );
481 pos[i].setX( -pos[i].getX() );
482 pos[i].setZ( -pos[i].getZ() );
487 for ( G4int j = 4; j < 8; j++ ) position += pos[j];
491 for ( G4int i = 0; i < 5; i++ )
493 if ( cryNb == pentaInOneSector[i] )
496 G4ThreeVector penta[8];
500 for ( G4int j = 0; j < 8; j++ ) penta[j] = fPnt1[30 + i][j];
502 for ( G4int j = 0; j < 8; j++ )
504 penta[j] = fPnt[30 + i][j];
505 penta[j].rotateZ( -67.5 * deg + sector * 22.5 * deg );
510 A1 = ( cryPoint[1] - cryPoint[2] ).r();
511 a1 = ( cryPoint[5] - cryPoint[6] ).r();
512 B1 = ( cryPoint[1] - cryPoint[0] ).r();
513 b1 = ( cryPoint[5] - cryPoint[4] ).r();
514 C1 = ( cryPoint[0] - cryPoint[3] ).r() + A;
515 c1 = ( cryPoint[4] - cryPoint[7] ).r() + a;
522 for ( G4int j = 0; j < 8; j++ )
524 penta[j].setZ( penta[j].getZ() + WorldZPosition +
526 if ( leftFlag == 1 ) penta[j].setX( -penta[j].getX() );
527 if ( downFlag == 1 ) penta[j].setY( -penta[j].getY() );
530 penta[j].setX( -penta[j].getX() );
531 penta[j].setZ( -penta[j].getZ() );
536 for ( G4int j = 4; j < 8; j++ )
538 if ( j != 0 && j != 4 ) position += pos[j];
539 if ( j == 0 || j == 1 || j == 4 || j == 5 ) position += penta[j];
543 flag = leftFlag + downFlag;
564 flag = leftFlag + downFlag + partId / 2;