85 for ( G4int i = 0; i < 30; i++ )
87 for ( G4int j = 0; j < 8; j++ )
91 new G4ThreeVector( param[i][j], param[i][j + 8], param[i][j + 16] - WorldZPosition );
95 if ( i == 5 || i == 6 || i == 14 || i == 15 || i == 16 )
97 for ( G4int j = 0; j < 8; j++ ) fPnt[30 + pentaNb][j] = fPnt[i][j];
100 G4double y0, y1, y4, y5;
101 G4ThreeVector v0, v1, v4, v5;
102 y0 = penta[pentaNb][0];
103 y1 = penta[pentaNb][1];
104 y4 = penta[pentaNb][2];
105 y5 = penta[pentaNb][3];
106 v0 = ( y0 - fPnt[i][3].getY() ) * ( fPnt[i][0] - fPnt[i][3] ) /
107 ( fPnt[i][0].getY() - fPnt[i][3].getY() ) +
109 v1 = ( y1 - fPnt[i][2].getY() ) * ( fPnt[i][1] - fPnt[i][2] ) /
110 ( fPnt[i][1].getY() - fPnt[i][2].getY() ) +
112 v4 = ( y4 - fPnt[i][7].getY() ) * ( fPnt[i][4] - fPnt[i][7] ) /
113 ( fPnt[i][4].getY() - fPnt[i][7].getY() ) +
115 v5 = ( y5 - fPnt[i][6].getY() ) * ( fPnt[i][5] - fPnt[i][6] ) /
116 ( fPnt[i][5].getY() - fPnt[i][6].getY() ) +
120 x1 = penta[pentaNb][4];
121 x5 = penta[pentaNb][5];
122 v1 = ( x1 - v0.getX() ) * ( v1 - v0 ) / ( v1.getX() - v0.getX() ) +
124 v5 = ( x5 - v4.getX() ) * ( v5 - v4 ) / ( v5.getX() - v4.getX() ) + v4;
131 fPnt[30 + pentaNb][2] = v1;
132 fPnt[30 + pentaNb][3] = v0;
133 fPnt[30 + pentaNb][6] = v5;
134 fPnt[30 + pentaNb][7] = v4;
141 G4ThreeVector temp[35][8];
142 for ( G4int i = 0; i < 35; i++ )
144 for ( G4int j = 0; j < 8; j++ )
146 temp[i][j] = fPnt[i][j];
147 fPnt[i][j].rotateZ( 157.5 * deg );
148 fPnt[i][j].setX( -fPnt[i][j].getX() );
152 for ( G4int j = 0; j < 8; j++ )
156 G4ThreeVector
v = fPnt[i][j];
157 fPnt[i][j] = fPnt[i][3 - j];
160 else if ( j >= 4 && j < 6 )
162 G4ThreeVector
v = fPnt[i][j];
163 fPnt[i][j] = fPnt[i][11 - j];
196 for ( G4int i = 0; i < 35; i++ )
198 for ( G4int j = 0; j < 8; j++ )
200 G4ThreeVector pPnt1 = temp[i][j];
201 fPnt1[i][j] = pPnt1.rotateZ( 67.5 * deg );
203 if ( ( i == 3 ) || ( i == 7 ) || ( i == 12 ) || ( i == 17 ) || ( i == 23 ) || ( i == 29 ) )
205 fPnt1[i][0].setX( 10 );
206 fPnt1[i][1].setX( 10 );
207 fPnt1[i][4].setX( 10 );
208 fPnt1[i][5].setX( 10 );
210 G4double y0 = fPnt1[i][0].getY() +
211 10 * ( fPnt1[i][3].getY() - fPnt1[i][0].getY() ) / fPnt1[i][3].getX();
212 G4double y1 = fPnt1[i][1].getY() +
213 10 * ( fPnt1[i][2].getY() - fPnt1[i][1].getY() ) / fPnt1[i][2].getX();
214 G4double y4 = fPnt1[i][4].getY() +
215 10 * ( fPnt1[i][7].getY() - fPnt1[i][4].getY() ) / fPnt1[i][7].getX();
216 G4double y5 = fPnt1[i][5].getY() +
217 10 * ( fPnt1[i][6].getY() - fPnt1[i][5].getY() ) / fPnt1[i][6].getX();
219 G4double z0 = fPnt1[i][0].getZ() +
220 10 * ( fPnt1[i][3].getZ() - fPnt1[i][0].getZ() ) / fPnt1[i][3].getX();
221 G4double z1 = fPnt1[i][1].getZ() +
222 10 * ( fPnt1[i][2].getZ() - fPnt1[i][1].getZ() ) / fPnt1[i][2].getX();
223 G4double z4 = fPnt1[i][4].getZ() +
224 10 * ( fPnt1[i][7].getZ() - fPnt1[i][4].getZ() ) / fPnt1[i][7].getX();
225 G4double z5 = fPnt1[i][5].getZ() +
226 10 * ( fPnt1[i][6].getZ() - fPnt1[i][5].getZ() ) / fPnt1[i][6].getX();
228 fPnt1[i][0].setY( y0 );
229 fPnt1[i][1].setY( y1 );
230 fPnt1[i][4].setY( y4 );
231 fPnt1[i][5].setY( y5 );
233 fPnt1[i][0].setZ( z0 );
234 fPnt1[i][1].setZ( z1 );
235 fPnt1[i][4].setZ( z4 );
236 fPnt1[i][5].setZ( z5 );
273 G4ThreeVector center1( 0, 0, 0 );
274 G4ThreeVector center2( 0, 0, 0 );
276 if ( CryNb == 5 || CryNb == 6 || CryNb == 14 || CryNb == 15 || CryNb == 16 )
278 center1 = ( pos[0] + pos[1] ) / 2;
279 center2 = ( pos[4] + pos[5] ) / 2;
281 else if ( CryNb >= 30 && CryNb < 35 )
283 center1 = ( pos[2] + pos[3] ) / 2;
284 center2 = ( pos[6] + pos[7] ) / 2;
288 center1 = ( pos[0] + pos[1] + pos[2] + pos[3] ) / 4;
289 center2 = ( pos[4] + pos[5] + pos[6] + pos[7] ) / 4;
292 G4double r1 = ( pos[1] - center1 ).r();
293 G4double r2 = ( pos[2] - center1 ).r();
294 G4double r12 = ( pos[1] - pos[2] ).r();
295 G4double theta = acos( ( r2 * r2 + r12 * r12 - r1 * r1 ) / ( 2 * r2 * r12 ) );
296 G4double h = r2 *
sin( theta );
297 G4double t1 = totalThickness / h;
299 r1 = ( pos[5] - center2 ).r();
300 r2 = ( pos[6] - center2 ).r();
301 r12 = ( pos[5] - pos[6] ).r();
302 theta = acos( ( r2 * r2 + r12 * r12 - r1 * r1 ) / ( 2 * r2 * r12 ) );
303 h = r2 *
sin( theta );
304 G4double t2 = totalThickness / h;
306 for ( G4int i = 0; i < 8; i++ )
308 if ( i < 4 ) { cryPoint[i] = ( 1 - t1 ) * pos[i] + t1 * center1; }
311 G4ThreeVector temp = ( 1 - t2 ) * pos[i] + t2 * center2;
312 cryPoint[i] = ( 1 - totalThickness / CrystalLength ) * temp +
313 ( totalThickness / CrystalLength ) * pos[i - 4];
320 const G4int numPhi ) {
322 G4int sector = -1, cryNb = -1;
327 G4double A1 = 0, a1 = 0, B1 = 0, b1 = 0, C1 = 0, c1 = 0, D1 = 0, d1 = 0, E1 = 0,
330 G4ThreeVector position( 0, 0, 0 );
331 G4int cryInOneSector =
332 cryNumInOneLayer[numTheta] / 16;
333 G4ThreeVector pos[8];
337 if ( numPhi >= 0 && numPhi < 8 * cryInOneSector )
338 m_numPhi = 8 * cryInOneSector - 1 - numPhi;
339 else if ( numPhi >= 8 * cryInOneSector && numPhi < 16 * cryInOneSector )
340 m_numPhi = 16 * cryInOneSector - 1 - numPhi;
345 if ( numPhi >= 4 * cryInOneSector && numPhi < 5 * cryInOneSector )
348 m_numPhi = 8 * cryInOneSector - 1 - numPhi;
350 else if ( numPhi >= 11 * cryInOneSector && numPhi < 12 * cryInOneSector )
355 m_numPhi = numPhi - 8 * cryInOneSector;
357 if ( numPhi >= 12 * cryInOneSector && numPhi < 13 * cryInOneSector )
361 m_numPhi = 16 * cryInOneSector - 1 - numPhi;
365 G4int cryNbOffset = 0;
366 for ( G4int i = 0; i < numTheta; i++ ) cryNbOffset += cryNumInOneLayer[i] / 16;
367 if ( cryInOneSector ) sector = m_numPhi / cryInOneSector;
368 cryNb = m_numPhi - cryInOneSector * sector + cryNbOffset;
370 if ( sector > 15 && sector <= 18 ) sector -= 16;
374 for ( G4int i = 0; i < 8; i++ ) pos[i] = fPnt1[cryNb][i];
376 for ( G4int i = 0; i < 8; i++ )
378 pos[i] = fPnt[cryNb][i];
379 pos[i].rotateZ( -67.5 * deg + sector * 22.5 * deg );
384 G4double A = ( cryPoint[0] - cryPoint[3] ).r();
385 G4double a = ( cryPoint[4] - cryPoint[7] ).r();
386 G4double B = ( cryPoint[1] - cryPoint[2] ).r();
387 G4double b = ( cryPoint[5] - cryPoint[6] ).r();
388 G4double
C = ( cryPoint[0] - cryPoint[1] ).r();
389 G4double c = ( cryPoint[4] - cryPoint[5] ).r();
390 G4double D = ( cryPoint[2] - cryPoint[3] ).r();
391 G4double d = ( cryPoint[6] - cryPoint[7] ).r();
394 for ( G4int i = 0; i < 8; i++ )
396 pos[i].setZ( pos[i].getZ() + WorldZPosition );
397 if ( leftFlag == 1 ) pos[i].setX( -pos[i].getX() );
398 if ( downFlag == 1 ) pos[i].setY( -pos[i].getY() );
401 pos[i].setX( -pos[i].getX() );
402 pos[i].setZ( -pos[i].getZ() );
407 for ( G4int j = 4; j < 8; j++ ) position += pos[j];
411 for ( G4int i = 0; i < 5; i++ )
413 if ( cryNb == pentaInOneSector[i] )
416 G4ThreeVector penta[8];
420 for ( G4int j = 0; j < 8; j++ ) penta[j] = fPnt1[30 + i][j];
422 for ( G4int j = 0; j < 8; j++ )
424 penta[j] = fPnt[30 + i][j];
425 penta[j].rotateZ( -67.5 * deg + sector * 22.5 * deg );
430 A1 = ( cryPoint[1] - cryPoint[2] ).r();
431 a1 = ( cryPoint[5] - cryPoint[6] ).r();
432 B1 = ( cryPoint[1] - cryPoint[0] ).r();
433 b1 = ( cryPoint[5] - cryPoint[4] ).r();
434 C1 = ( cryPoint[0] - cryPoint[3] ).r() + A;
435 c1 = ( cryPoint[4] - cryPoint[7] ).r() + a;
442 for ( G4int j = 0; j < 8; j++ )
444 penta[j].setZ( penta[j].getZ() + WorldZPosition );
445 if ( leftFlag == 1 ) penta[j].setX( -penta[j].getX() );
446 if ( downFlag == 1 ) penta[j].setY( -penta[j].getY() );
449 penta[j].setX( -penta[j].getX() );
450 penta[j].setZ( -penta[j].getZ() );
455 for ( G4int j = 4; j < 8; j++ )
457 if ( j != 0 && j != 4 ) position += pos[j];
458 if ( j == 0 || j == 1 || j == 4 || j == 5 ) position += penta[j];
462 flag = leftFlag + downFlag;
483 flag = leftFlag + downFlag + partId / 2;