71 world( 0 ), gdmlFile( gdmlFile ), validateGDMLFile( validateGDMLFile ),
72 calorimeterRegionInitialized( false ),
73 calorimeterGeometryDataInitialized( false ), monitorVolume( NULL ),
74 vetoCounterVolume( NULL ), calorimeterVolume( NULL ), targetVolume( NULL ),
75 rightVetoCounter( NULL ), rightCalorimeter( NULL )
87 gdmlParser.
Read( gdmlFile, validateGDMLFile );
90 SetupSpecialVolumes( gdmlParser );
92 ReadTransforms( gdmlParser );
102 dynamic_cast< const CexmcPhysicsManager * >(
105 if ( ! physicsManager )
109 const_cast< CexmcPhysicsManager * >( physicsManager ) );
116 void CexmcSetup::SetupSpecialVolumes(
const G4GDMLParser & gdmlParser )
122 for ( std::vector< G4LogicalVolume * >::const_iterator
123 lvIter( lvs->begin() ); lvIter != lvs->end(); ++lvIter )
130 for ( G4GDMLAuxListType::const_iterator pair( auxInfo.begin() );
131 pair != auxInfo.end(); ++pair )
134 G4String detectorName(
"uninitialized" );
137 if ( pair->type ==
"EnergyDepositDetector" )
141 if ( pair->value ==
"MonitorRole" )
143 AssertAndAsignDetectorRole( curDetectorRole,
149 if ( pair->value ==
"VetoCounterRole" )
151 AssertAndAsignDetectorRole( curDetectorRole,
158 if ( pair->value ==
"CalorimeterRole" )
160 AssertAndAsignDetectorRole( curDetectorRole,
170 detectorName <<
"' in volume '" << volumeName <<
174 if ( pair->type ==
"TrackPointsDetector" )
178 if ( pair->value ==
"MonitorRole" )
180 AssertAndAsignDetectorRole( curDetectorRole,
186 if ( pair->value ==
"VetoCounterRole" )
188 AssertAndAsignDetectorRole( curDetectorRole,
195 if ( pair->value ==
"CalorimeterRole" )
197 AssertAndAsignDetectorRole( curDetectorRole,
204 if ( pair->value ==
"TargetRole" )
206 AssertAndAsignDetectorRole( curDetectorRole,
215 detectorName <<
"' in volume '" << volumeName <<
221 scorer->SetFilter( filter );
225 if ( pair->type ==
"SensitiveRegion" )
229 if ( pair->value ==
"CalorimeterRegion" )
232 if ( calorimeterRegionInitialized )
246 GetUserPhysicsList() );
248 defaultProductionCut =
249 physicsList->GetDefaultCutValue();
250 cuts->SetProductionCut( defaultProductionCut );
251 region->SetProductionCuts( cuts );
252 calorimeterRegionInitialized =
true;
254 region->AddRootLogicalVolume( *lvIter );
259 "volume '" << volumeName <<
"' registered" <<
263 if ( pair->type ==
"SpecialVolume" )
267 if ( pair->value ==
"Monitor" )
269 monitorVolume = *lvIter;
273 if ( pair->value ==
"VetoCounter" )
275 vetoCounterVolume = *lvIter;
279 if ( pair->value ==
"Calorimeter" )
281 calorimeterVolume = *lvIter;
283 ReadCalorimeterGeometryData( *lvIter );
284 calorimeterGeometryDataInitialized =
true;
287 if ( pair->value ==
"Target" )
289 targetVolume = *lvIter;
303 if ( ! detector[ curDetectorRole ] )
305 detector[ curDetectorRole ] =
311 scorer->InitializeMessenger();
316 ( *lvIter )->SetSensitiveDetector(
317 detector[ curDetectorRole ] );
322 if ( ! calorimeterRegionInitialized )
325 if ( ! calorimeterGeometryDataInitialized )
336 void CexmcSetup::ReadTransforms(
const G4GDMLParser & gdmlParser )
342 RotateMatrix( rotation, rm );
347 rotation = gdmlParser.
GetRotation(
"CalorimeterLeftRot" );
349 RotateMatrix( rotation, rm );
354 rotation = gdmlParser.
GetRotation(
"CalorimeterRightRot" );
356 RotateMatrix( rotation, rm );
362 void CexmcSetup::ReadCalorimeterGeometryData(
377 if ( pVolume->IsReplicated() )
379 pVolume->GetReplicationData( axis,
381 width, offset, consuming );
384 lVolume = pVolume->GetLogicalVolume();
394 if ( pVolume->IsReplicated() )
396 pVolume->GetReplicationData( axis, calorimeterGeometry.
nCrystalsInRow,
397 width, offset, consuming );
400 lVolume = pVolume->GetLogicalVolume();
405 G4Box * crystalBox( dynamic_cast< G4Box * >( lVolume->
GetSolid() ) );
410 calorimeterGeometry.
crystalWidth = crystalBox->GetXHalfLength() * 2;
411 calorimeterGeometry.
crystalHeight = crystalBox->GetYHalfLength() * 2;
412 calorimeterGeometry.
crystalLength = crystalBox->GetZHalfLength() * 2;
424 row =
G4int( ( src.
y() + crystalHeight * nCrystalsInColumn / 2 ) /
426 column =
G4int( ( src.
x() + crystalWidth * nCrystalsInRow / 2 ) /
430 crystalWidth + crystalWidth / 2 );
433 crystalHeight + crystalHeight / 2 );
434 dst.
setX( src.
x() - xInCalorimeterOffset );
435 dst.
setY( src.
y() - yInCalorimeterOffset );
439 void CexmcSetup::ReadRightDetectors(
void )
443 for ( std::vector< G4VPhysicalVolume * >::const_iterator k( pvs->begin() );
444 k != pvs->end(); ++k )
456 if ( ( *k )->GetLogicalVolume() == vetoCounterVolume )
458 if ( ( *k )->GetName().contains(
"Right" ) )
459 rightVetoCounter = *k;
462 if ( ( *k )->GetLogicalVolume() == calorimeterVolume )
464 if ( ( *k )->GetName().contains(
"Right" ) )
465 rightCalorimeter = *k;
476 if ( detectorRole != CexmcNumberOfDetectorRoles && detectorRole != value )
479 detectorRole =
value;