54 #include <TCollection.h> 
   55 #include <TDirectory.h> 
   57 #ifdef CEXMC_USE_ROOTQT 
   60 #include <QApplication> 
   82     const G4double  CexmcHistoBeamMomentumMin( 0.0 * 
GeV );
 
   83     const G4double  CexmcHistoBeamMomentumMax( 1.0 * 
GeV );
 
   84     const G4double  CexmcHistoBeamMomentumResolution( 0.5 * 
MeV );
 
   85     const G4double  CexmcHistoTPResolution( 0.1 * 
cm );
 
   86     const G4double  CexmcHistoTPSafetyArea( 1.0 * 
cm );
 
   87     const G4double  CexmcHistoMassResolution( 1.0 * 
MeV );
 
   89     const G4double  CexmcHistoEnergyResolution( 1.0 * 
MeV );
 
   90     const G4double  CexmcHistoMissEnergyMin( -0.1 * 
GeV );
 
   91     const G4double  CexmcHistoMissEnergyMax( 0.2 * 
GeV );
 
   92     const G4double  CexmcHistoMissEnergyResolution( 0.2 * 
MeV );
 
   93     const G4double  CexmcHistoAngularResolution( 0.5 );
 
   94     const G4double  CexmcHistoAngularCResolution( 0.001 );
 
   95     const G4int     CexmcHistoCanvasWidth( 800 );
 
   96     const G4int     CexmcHistoCanvasHeight( 600 );
 
   97     const G4String  CexmcHistoDirectoryHandle( 
"histograms" );
 
   98     const G4String  CexmcHistoDirectoryTitle( 
"Histograms" );
 
  105 CexmcHistoManager *  CexmcHistoManager::Instance( 
void )
 
  114 void  CexmcHistoManager::Destroy( 
void )
 
  121 CexmcHistoManager::CexmcHistoManager() : outFile( NULL ),
 
  122     isInitialized( false ), opName( 
"" ), nopName( 
"" ), opMass( 0. ),
 
  123     nopMass( 0. ), verboseLevel( 0 ),
 
  124 #ifdef CEXMC_USE_ROOTQT
 
  125     rootCanvas( NULL ), areLiveHistogramsEnabled( false ),
 
  126     isHistoMenuInitialized( false ), drawOptions1D( 
"" ), drawOptions2D( 
"" ),
 
  127     drawOptions3D( 
"" ), histoMenuHandle( 
"" ), histoMenuLabel( 
"" ),
 
  131     for ( 
int  i( 0 ); i < CexmcHistoType_SIZE; ++i )
 
  133         histos.insert( CexmcHistoPair( CexmcHistoType( i ),
 
  134                                        CexmcHistoVector() ) );
 
  137     messenger = 
new CexmcHistoManagerMessenger( 
this );
 
  141 CexmcHistoManager::~CexmcHistoManager()
 
  151 #ifdef CEXMC_USE_ROOTQT 
  158 void  CexmcHistoManager::AddHisto( 
const CexmcHistoData &  
data,
 
  167     if ( data.isARHisto )
 
  171             fullName += 
"_arrec";
 
  172             rangeTypeLabel = 
"rec";
 
  176             fullName += 
"_arreal";
 
  177             rangeTypeLabel = 
"real";
 
  181     switch ( data.triggerType )
 
  185         decorTriggerTypeLabel = 
" --tpt--";
 
  186         fullTitle += decorTriggerTypeLabel;
 
  187         triggerTypeLabel = 
"tpt";
 
  191         decorTriggerTypeLabel = 
" --edt--";
 
  192         fullTitle += decorTriggerTypeLabel;
 
  193         triggerTypeLabel = 
"edt";
 
  197         decorTriggerTypeLabel = 
" --rt--";
 
  198         fullTitle += decorTriggerTypeLabel;
 
  199         triggerTypeLabel = 
"rt";
 
  205     CexmcHistosMap::iterator  found( histos.find( data.type ) );
 
  207     if ( found == histos.end() )
 
  210     CexmcHistoVector &  histoVector( found->second );
 
  212     if ( data.isARHisto )
 
  216         dirOk = gDirectory->Get( fullName ) != NULL;
 
  219             dirOk = ( gDirectory->mkdir( fullName, fullTitle ) != NULL );
 
  222             gDirectory->cd( fullName );
 
  224         std::ostringstream  histoName;
 
  225         std::ostringstream  histoTitle;
 
  226         histoName << data.name << 
"_r" << aRange.
index + 1 << rangeTypeLabel <<
 
  227                 "_" << triggerTypeLabel;
 
  228         histoTitle << data.title << 
" {range " << aRange.
index + 1 <<
 
  229                 rangeTypeLabel << 
" [" << std::fixed <<
 
  230                 std::setprecision( 4 ) << aRange.
top << 
", " <<
 
  231                 aRange.
bottom << 
")}" << decorTriggerTypeLabel;
 
  232         CreateHisto( histoVector, data.impl, histoName.str(), histoTitle.str(),
 
  236             gDirectory->cd( 
".." );
 
  240         CreateHisto( histoVector, data.impl, fullName, fullTitle, data.axes );
 
  245 void  CexmcHistoManager::CreateHisto( CexmcHistoVector &  histoVector,
 
  254         histo = 
new TH1F( name, title, axes.at( 0 ).nBins,
 
  255                           axes.at( 0 ).nBinsMin, axes.at( 0 ).nBinsMax );
 
  258         histo = 
new TH2F( name, title, axes.at( 0 ).nBins,
 
  259                           axes.at( 0 ).nBinsMin, axes.at( 0 ).nBinsMax,
 
  260                           axes.at( 1 ).nBins, axes.at( 1 ).nBinsMin,
 
  261                           axes.at( 1 ).nBinsMax );
 
  264         histo = 
new TH3F( name, title, axes.at( 0 ).nBins,
 
  265                           axes.at( 0 ).nBinsMin, axes.at( 0 ).nBinsMax,
 
  266                           axes.at( 1 ).nBins, axes.at( 1 ).nBinsMin,
 
  267                           axes.at( 1 ).nBinsMax, axes.at( 2 ).nBins,
 
  268                           axes.at( 2 ).nBinsMin, axes.at( 2 ).nBinsMax );
 
  275         histoVector.push_back( histo );
 
  288     if ( ! physicsManager )
 
  292                                                         GetProductionModel() );
 
  294     if ( ! productionModel )
 
  298                                 productionModel->GetOutputParticle() );
 
  300                                 productionModel->GetNucleusOutputParticle() );
 
  302     if ( ! outputParticle || ! nucleusOutputParticle )
 
  305     opName = outputParticle->GetParticleName();
 
  306     nopName = nucleusOutputParticle->GetParticleName();
 
  307     opMass = outputParticle->GetPDGMass();
 
  308     nopMass = nucleusOutputParticle->GetPDGMass();
 
  319     if ( runManager->ProjectIsSaved() )
 
  321         G4String  projectsDir( runManager->GetProjectsDir() );
 
  322         G4String  resultsFile( projectsDir + 
"/" + runManager->GetProjectId() +
 
  324         outFile = 
new TFile( resultsFile, 
"recreate" );
 
  328         outFile = 
new TDirectoryFile( CexmcHistoDirectoryHandle,
 
  329                                       CexmcHistoDirectoryTitle );
 
  330         gDirectory->cd( CexmcHistoDirectoryHandle );
 
  336     const CexmcSetup *  setup( static_cast< const CexmcSetup * >(
 
  337                                 runManager->GetUserDetectorConstruction() ) );
 
  346     nBinsMinX = CexmcHistoBeamMomentumMin;
 
  347     nBinsMaxX = CexmcHistoBeamMomentumMax;
 
  348     nBinsX = 
Int_t( ( nBinsMaxX - nBinsMinX ) /
 
  349                     CexmcHistoBeamMomentumResolution );
 
  350     axes.push_back( CexmcHistoAxisData( nBinsX, nBinsMinX, nBinsMaxX ) );
 
  351     AddHisto( CexmcHistoData( CexmcMomentumBP_TPT_Histo, Cexmc_TH1F, 
false,
 
  352           false, 
CexmcTPT, 
"mombp", 
"Beam momentum at the monitor", axes ) );
 
  353     AddHisto( CexmcHistoData( CexmcMomentumBP_RT_Histo, Cexmc_TH1F, 
false,
 
  354           false, 
CexmcRT, 
"mombp", 
"Beam momentum at the monitor", axes ) );
 
  355     if ( verboseLevel > 0 )
 
  357         AddHisto( CexmcHistoData( CexmcMomentumIP_TPT_Histo, Cexmc_TH1F, 
false,
 
  358             false, 
CexmcTPT, 
"momip", 
"Momentum of the incident particle",
 
  362     G4Box *   box( dynamic_cast< G4Box * >( lVolume->GetSolid() ) );
 
  368     G4double  height( box->GetYHalfLength() * 2 );
 
  370     G4double  halfHeight( height / 2 + CexmcHistoTPSafetyArea );
 
  372     nBinsX = 
Int_t( halfWidth * 2 / CexmcHistoTPResolution );
 
  373     nBinsY = 
Int_t( halfHeight * 2 / CexmcHistoTPResolution );
 
  375     axes.push_back( CexmcHistoAxisData( nBinsX, -halfWidth, halfWidth ) );
 
  376     axes.push_back( CexmcHistoAxisData( nBinsY, -halfHeight, halfHeight ) );
 
  377     AddHisto( CexmcHistoData( CexmcTPInMonitor_TPT_Histo, Cexmc_TH2F, 
false,
 
  378         false, 
CexmcTPT, 
"tpmon", 
"Track points (mon)", axes ) );
 
  381     G4Tubs *  tube( dynamic_cast< G4Tubs * >( lVolume->GetSolid() ) );
 
  386     G4double  radius( tube->GetOuterRadius() );
 
  387     height = tube->GetZHalfLength() * 2;
 
  388     halfWidth = radius + CexmcHistoTPSafetyArea;
 
  389     halfHeight = height / 2 + CexmcHistoTPSafetyArea;
 
  391     nBinsX = 
Int_t( halfWidth * 2 / CexmcHistoTPResolution );
 
  392     nBinsY = 
Int_t( halfWidth * 2 / CexmcHistoTPResolution );
 
  393     Int_t  nBinsZ( 
Int_t( halfHeight * 2 / CexmcHistoTPResolution ) );
 
  395     axes.push_back( CexmcHistoAxisData( nBinsX, -halfWidth, halfWidth ) );
 
  396     axes.push_back( CexmcHistoAxisData( nBinsY, -halfWidth, halfWidth ) );
 
  397     axes.push_back( CexmcHistoAxisData( nBinsZ, -halfHeight, halfHeight ) );
 
  398     AddHisto( CexmcHistoData( CexmcTPInTarget_TPT_Histo, Cexmc_TH3F, 
false,
 
  399         false, 
CexmcTPT, 
"tptar", 
"Track points (tar)", axes ) );
 
  400     AddHisto( CexmcHistoData( CexmcTPInTarget_RT_Histo, Cexmc_TH3F, 
false,
 
  401         false, 
CexmcRT, 
"tptar", 
"Track points (tar)", axes ) );
 
  403     title = 
"Reconstructed masses (" + nopName + 
" vs. " + opName + 
")";
 
  404     nBinsMinX = opMass / 2;
 
  405     nBinsMaxX = opMass + opMass / 2;
 
  406     nBinsMinY = nopMass / 2;
 
  407     nBinsMaxY = nopMass + nopMass / 2;
 
  408     nBinsX = 
Int_t( ( nBinsMaxX - nBinsMinX ) / CexmcHistoMassResolution );
 
  409     nBinsY = 
Int_t( ( nBinsMaxY - nBinsMinY ) / CexmcHistoMassResolution );
 
  411     axes.push_back( CexmcHistoAxisData( nBinsX, nBinsMinX, nBinsMaxX ) );
 
  412     axes.push_back( CexmcHistoAxisData( nBinsY, nBinsMinY, nBinsMaxY ) );
 
  413     AddHisto( CexmcHistoData( CexmcRecMasses_EDT_Histo, Cexmc_TH2F, 
false,
 
  414         false, 
CexmcEDT, 
"recmasses", title, axes ) );
 
  415     AddHisto( CexmcHistoData( CexmcRecMasses_RT_Histo, Cexmc_TH2F, 
false,
 
  416         false, 
CexmcRT, 
"recmasses", title, axes ) );
 
  419     nBinsMaxX = CexmcHistoEnergyMax;
 
  421     nBinsMaxY = CexmcHistoEnergyMax;
 
  422     nBinsX = 
Int_t( ( nBinsMaxX - nBinsMinX ) / CexmcHistoEnergyResolution );
 
  423     nBinsY = 
Int_t( ( nBinsMaxY - nBinsMinY ) / CexmcHistoEnergyResolution );
 
  425     axes.push_back( CexmcHistoAxisData( nBinsX, nBinsMinX, nBinsMaxX ) );
 
  426     axes.push_back( CexmcHistoAxisData( nBinsY, nBinsMinY, nBinsMaxY ) );
 
  427     AddHisto( CexmcHistoData( CexmcAbsorbedEnergy_EDT_Histo, Cexmc_TH2F, 
false,
 
  428         false, 
CexmcEDT, 
"ae", 
"Absorbed energy (rc vs. lc)", axes ) );
 
  429     AddHisto( CexmcHistoData( CexmcAbsorbedEnergy_RT_Histo, Cexmc_TH2F, 
false,
 
  430         false, 
CexmcRT, 
"ae", 
"Absorbed energy (rc vs. lc)", axes ) );
 
  432     SetupARHistos( runManager->GetPhysicsManager()->GetProductionModel()->
 
  433                    GetAngularRanges() );
 
  441     TIter      objs( gDirectory->GetList() );
 
  442     TObject *  obj( NULL );
 
  444     while ( ( obj = ( TObject * )objs() ) )
 
  446         TString   
name( obj->GetName() );
 
  448         if ( obj->IsFolder() && ( name.Contains( TString( 
"_arreal_" ) ) ||
 
  449                                   name.Contains( TString( 
"_arrec_" ) ) ) )
 
  451             gDirectory->cd( name );
 
  452             gDirectory->DeleteAll();
 
  453             gDirectory->cd( 
".." );
 
  457     for ( CexmcHistosMap::iterator  k( histos.begin() ); k != histos.end();
 
  460         if ( k->second.empty() )
 
  463         if ( k->first >= CexmcHistoType_ARReal_START &&
 
  464              k->first <= CexmcHistoType_ARReal_END )
 
  470     for ( CexmcAngularRangeList::const_iterator  k( aRanges.begin() );
 
  471                                                     k != aRanges.end(); ++k )
 
  486     title = 
"Reconstructed mass of " + opName;
 
  487     nBinsMinX = opMass / 2;
 
  488     nBinsMaxX = opMass + opMass / 2;
 
  489     nBinsX = 
Int_t( ( nBinsMaxX - nBinsMinX ) / CexmcHistoMassResolution );
 
  490     axes.push_back( CexmcHistoAxisData( nBinsX, nBinsMinX, nBinsMaxX ) );
 
  491     AddHisto( CexmcHistoData( CexmcRecMassOP_ARReal_RT_Histo, Cexmc_TH1F, 
true,
 
  492         false, 
CexmcRT, 
"recmassop", title, axes ), aRange );
 
  494     title = 
"Reconstructed mass of " + nopName;
 
  495     nBinsMinX = nopMass / 2;
 
  496     nBinsMaxX = nopMass + nopMass / 2;
 
  497     nBinsX = 
Int_t( ( nBinsMaxX - nBinsMinX ) / CexmcHistoMassResolution );
 
  499     axes.push_back( CexmcHistoAxisData( nBinsX, nBinsMinX, nBinsMaxX ) );
 
  500     AddHisto( CexmcHistoData( CexmcRecMassNOP_ARReal_RT_Histo, Cexmc_TH1F, 
true,
 
  501         false, 
CexmcRT, 
"recmassnop", title, axes ), aRange );
 
  504     const CexmcSetup *  setup( static_cast< const CexmcSetup * >(
 
  505                                 runManager->GetUserDetectorConstruction() ) );
 
  512     G4Box *   box( dynamic_cast< G4Box * >( lVolume->GetSolid() ) );
 
  518     G4double  height( box->GetYHalfLength() * 2 );
 
  520     G4double  halfHeight( height / 2 + CexmcHistoTPSafetyArea );
 
  522     nBinsX = 
Int_t( halfWidth * 2 / CexmcHistoTPResolution );
 
  523     Int_t  nBinsY( 
Int_t( halfHeight * 2 / CexmcHistoTPResolution ) );
 
  525     axes.push_back( CexmcHistoAxisData( nBinsX, -halfWidth, halfWidth ) );
 
  526     axes.push_back( CexmcHistoAxisData( nBinsY, -halfHeight, halfHeight ) );
 
  531     AddHisto( CexmcHistoData( CexmcOPDPAtLeftCalorimeter_ARReal_EDT_Histo,
 
  532         Cexmc_TH2F, 
true, 
false, 
CexmcEDT, 
"opdpcl",
 
  533         "Gamma position on the surface (lc)", axes ), aRange );
 
  534     AddHisto( CexmcHistoData( CexmcOPDPAtRightCalorimeter_ARReal_EDT_Histo,
 
  535         Cexmc_TH2F, 
true, 
false, 
CexmcEDT, 
"opdpcr",
 
  536         "Gamma position on the surface (rc)", axes ), aRange );
 
  537     AddHisto( CexmcHistoData( CexmcOPDPAtLeftCalorimeter_ARReal_RT_Histo,
 
  538         Cexmc_TH2F, 
true, 
false, 
CexmcRT, 
"opdpcl",
 
  539         "Gamma position on the surface (lc)", axes ), aRange );
 
  540     AddHisto( CexmcHistoData( CexmcOPDPAtRightCalorimeter_ARReal_RT_Histo,
 
  541         Cexmc_TH2F, 
true, 
false, 
CexmcRT, 
"opdpcr",
 
  542         "Gamma position on the surface (rc)", axes ), aRange );
 
  543     AddHisto( CexmcHistoData( CexmcRecOPDPAtLeftCalorimeter_ARReal_EDT_Histo,
 
  544         Cexmc_TH2F, 
true, 
false, 
CexmcEDT, 
"recopdpcl",
 
  545         "Reconstructed gamma position on the surface (lc)", axes ), aRange );
 
  546     AddHisto( CexmcHistoData( CexmcRecOPDPAtRightCalorimeter_ARReal_EDT_Histo,
 
  547         Cexmc_TH2F, 
true, 
false, 
CexmcEDT, 
"recopdpcr",
 
  548         "Reconstructed gamma position on the surface (rc)", axes ), aRange );
 
  549     AddHisto( CexmcHistoData( CexmcRecOPDPAtLeftCalorimeter_ARReal_RT_Histo,
 
  550         Cexmc_TH2F, 
true, 
false, 
CexmcRT, 
"recopdpcl",
 
  551         "Reconstructed gamma position on the surface (lc)", axes ), aRange );
 
  552     AddHisto( CexmcHistoData( CexmcRecOPDPAtRightCalorimeter_ARReal_RT_Histo,
 
  553         Cexmc_TH2F, 
true, 
false, 
CexmcRT, 
"recopdpcr",
 
  554         "Reconstructed gamma position on the surface (rc)", axes ), aRange );
 
  557     nBinsMaxX = CexmcHistoEnergyMax;
 
  558     nBinsX = 
Int_t( ( nBinsMaxX - nBinsMinX ) / CexmcHistoEnergyResolution );
 
  560     axes.push_back( CexmcHistoAxisData( nBinsX, nBinsMinX, nBinsMaxX ) );
 
  561     AddHisto( CexmcHistoData( CexmcKinEnAtLeftCalorimeter_ARReal_TPT_Histo,
 
  562         Cexmc_TH1F, 
true, 
false, 
CexmcTPT, 
"kecl",
 
  563         "Kinetic energy of gamma (lc)", axes ), aRange );
 
  564     AddHisto( CexmcHistoData( CexmcKinEnAtRightCalorimeter_ARReal_TPT_Histo,
 
  565         Cexmc_TH1F, 
true, 
false, 
CexmcTPT, 
"kecr",
 
  566         "Kinetic energy of gamma (rc)", axes ), aRange );
 
  567     AddHisto( CexmcHistoData( CexmcKinEnAtLeftCalorimeter_ARReal_RT_Histo,
 
  568         Cexmc_TH1F, 
true, 
false, 
CexmcRT, 
"kecl",
 
  569         "Kinetic energy of gamma (lc)", axes ), aRange );
 
  570     AddHisto( CexmcHistoData( CexmcKinEnAtRightCalorimeter_ARReal_RT_Histo,
 
  571         Cexmc_TH1F, 
true, 
false, 
CexmcRT, 
"kecr",
 
  572         "Kinetic energy of gamma (rc)", axes ), aRange );
 
  573     AddHisto( CexmcHistoData( CexmcAbsEnInLeftCalorimeter_ARReal_EDT_Histo,
 
  574         Cexmc_TH1F, 
true, 
false, 
CexmcEDT, 
"aecl",
 
  575         "Absorbed energy (lc)", axes ), aRange );
 
  576     AddHisto( CexmcHistoData( CexmcAbsEnInRightCalorimeter_ARReal_EDT_Histo,
 
  577         Cexmc_TH1F, 
true, 
false, 
CexmcEDT, 
"aecr",
 
  578         "Absorbed energy (rc)", axes ), aRange );
 
  579     AddHisto( CexmcHistoData( CexmcAbsEnInLeftCalorimeter_ARReal_RT_Histo,
 
  580         Cexmc_TH1F, 
true, 
false, 
CexmcRT, 
"aecl",
 
  581         "Absorbed energy (lc)", axes ), aRange );
 
  582     AddHisto( CexmcHistoData( CexmcAbsEnInRightCalorimeter_ARReal_RT_Histo,
 
  583         Cexmc_TH1F, 
true, 
false, 
CexmcRT, 
"aecr",
 
  584         "Absorbed energy (rc)", axes ), aRange );
 
  586     nBinsMinX = CexmcHistoMissEnergyMin;
 
  587     nBinsMaxX = CexmcHistoMissEnergyMax;
 
  588     nBinsX = 
Int_t( ( nBinsMaxX - nBinsMinX ) /
 
  589                     CexmcHistoMissEnergyResolution );
 
  591     axes.push_back( CexmcHistoAxisData( nBinsX, nBinsMinX, nBinsMaxX ) );
 
  592     AddHisto( CexmcHistoData( CexmcMissEnFromLeftCalorimeter_ARReal_RT_Histo,
 
  593         Cexmc_TH1F, 
true, 
false, 
CexmcRT, 
"mecl",
 
  594         "Missing energy (lc)", axes ), aRange );
 
  595     AddHisto( CexmcHistoData( CexmcMissEnFromRightCalorimeter_ARReal_RT_Histo,
 
  596         Cexmc_TH1F, 
true, 
false, 
CexmcRT, 
"mecr",
 
  597         "Missing energy (rc)", axes ), aRange );
 
  599     title = 
"Kinetic energy of newborn " + opName + 
" (lab)";
 
  601     nBinsMaxX = CexmcHistoEnergyMax;
 
  602     nBinsX = 
Int_t( ( nBinsMaxX - nBinsMinX ) / CexmcHistoEnergyResolution );
 
  604     axes.push_back( CexmcHistoAxisData( nBinsX, nBinsMinX, nBinsMaxX ) );
 
  605     AddHisto( CexmcHistoData( CexmcKinEnOP_LAB_ARReal_TPT_Histo,
 
  606         Cexmc_TH1F, 
true, 
false, 
CexmcTPT, 
"keop_lab", title, axes ), aRange );
 
  607     AddHisto( CexmcHistoData( CexmcKinEnOP_LAB_ARReal_RT_Histo,
 
  608         Cexmc_TH1F, 
true, 
false, 
CexmcRT, 
"keop_lab", title, axes ), aRange );
 
  610     title = 
"Angle of newborn " + opName + 
" (scm)";
 
  613     nBinsX = 
Int_t( ( nBinsMaxX - nBinsMinX ) / CexmcHistoAngularCResolution );
 
  615     axes.push_back( CexmcHistoAxisData( nBinsX, nBinsMinX, nBinsMaxX ) );
 
  616     AddHisto( CexmcHistoData( CexmcAngleOP_SCM_ARReal_TPT_Histo,
 
  617         Cexmc_TH1F, 
true, 
false, 
CexmcTPT, 
"aop_scm", title, axes ), aRange );
 
  618     AddHisto( CexmcHistoData( CexmcAngleOP_SCM_ARReal_RT_Histo,
 
  619         Cexmc_TH1F, 
true, 
false, 
CexmcRT, 
"aop_scm", title, axes ), aRange );
 
  621     title = 
"Reconstruced angle of newborn " + opName + 
" (scm)";
 
  622     AddHisto( CexmcHistoData( CexmcRecAngleOP_SCM_ARReal_RT_Histo,
 
  623         Cexmc_TH1F, 
true, 
false, 
CexmcRT, 
"recaop_scm", title, axes ), aRange );
 
  625     title = 
"Real - reconstruced angle of newborn " + opName + 
" (scm)";
 
  626     AddHisto( CexmcHistoData( CexmcDiffAngleOP_SCM_ARReal_RT_Histo,
 
  627         Cexmc_TH1F, 
true, 
false, 
CexmcRT, 
"diffaop_scm", title, axes ),
 
  632     nBinsX = 
Int_t( ( nBinsMaxX - nBinsMinX ) / CexmcHistoAngularResolution );
 
  634     axes.push_back( CexmcHistoAxisData( nBinsX, nBinsMinX, nBinsMaxX ) );
 
  635     AddHisto( CexmcHistoData( CexmcOpenAngle_ARReal_TPT_Histo,
 
  636         Cexmc_TH1F, 
true, 
false, 
CexmcTPT, 
"oa",
 
  637         "Open angle between the gammas", axes ), aRange );
 
  638     AddHisto( CexmcHistoData( CexmcOpenAngle_ARReal_RT_Histo,
 
  639         Cexmc_TH1F, 
true, 
false, 
CexmcRT, 
"oa",
 
  640         "Open angle between the gammas", axes ), aRange );
 
  641     AddHisto( CexmcHistoData( CexmcRecOpenAngle_ARReal_RT_Histo,
 
  642         Cexmc_TH1F, 
true, 
false, 
CexmcRT, 
"recoa",
 
  643         "Reconstructed open angle between the gammas", axes ), aRange );
 
  647     nBinsX = 
Int_t( ( nBinsMaxX - nBinsMinX ) / CexmcHistoAngularResolution );
 
  649     axes.push_back( CexmcHistoAxisData( nBinsX, nBinsMinX, nBinsMaxX ) );
 
  650     AddHisto( CexmcHistoData( CexmcDiffOpenAngle_ARReal_RT_Histo,
 
  651         Cexmc_TH1F, 
true, 
false, 
CexmcRT, 
"diffoa",
 
  652         "Real - reconstructed open angle between the gammas", axes ), aRange );
 
  655     G4Tubs *  tube( dynamic_cast< G4Tubs * >( lVolume->GetSolid() ) );
 
  660     G4double  radius( tube->GetOuterRadius() );
 
  661     height = tube->GetZHalfLength() * 2;
 
  662     halfWidth = radius + CexmcHistoTPSafetyArea;
 
  663     halfHeight = height / 2 + CexmcHistoTPSafetyArea;
 
  665     nBinsX = 
Int_t( halfWidth * 2 / CexmcHistoTPResolution );
 
  666     nBinsY = 
Int_t( halfWidth * 2 / CexmcHistoTPResolution );
 
  667     Int_t  nBinsZ( 
Int_t( halfHeight * 2 / CexmcHistoTPResolution ) );
 
  669     axes.push_back( CexmcHistoAxisData( nBinsX, -halfWidth, halfWidth ) );
 
  670     axes.push_back( CexmcHistoAxisData( nBinsY, -halfWidth, halfWidth ) );
 
  671     axes.push_back( CexmcHistoAxisData( nBinsZ, -halfHeight, halfHeight ) );
 
  672     AddHisto( CexmcHistoData( CexmcTPInTarget_ARReal_TPT_Histo, Cexmc_TH3F,
 
  673         true, 
false, 
CexmcTPT, 
"tptar", 
"Track points (tar)", axes ), aRange );
 
  674     AddHisto( CexmcHistoData( CexmcTPInTarget_ARReal_RT_Histo, Cexmc_TH3F,
 
  675         true, 
false, 
CexmcRT, 
"tptar", 
"Track points (tar)", axes ), aRange );
 
  682     CexmcHistosMap::iterator  found( histos.find( histoType ) );
 
  683     if ( found == histos.end() || histos[ histoType ].size() <= index )
 
  686     histos[ histoType ][ index ]->Fill( x );
 
  693     CexmcHistosMap::iterator  found( histos.find( histoType ) );
 
  694     if ( found == histos.end() || histos[ histoType ].size() <= index )
 
  699     histos[ histoType ][ index ]->Fill( x, y );
 
  706     CexmcHistosMap::iterator  found( histos.find( histoType ) );
 
  707     if ( found == histos.end() || histos[ histoType ].size() <= index )
 
  712     TH3 *  histo( static_cast< TH3 * >( histos[ histoType ][ index ] ) );
 
  714     histo->Fill( x, y, z );
 
  721     CexmcHistosMap::iterator  found( histos.find( histoType ) );
 
  722     if ( found == histos.end() || histos[ histoType ].size() <= index )
 
  727     Double_t  curValue( histos[ histoType ][ index ]->GetBinContent(
 
  729     histos[ histoType ][ index ]->SetBinContent( binX, binY,
 
  730                                                      curValue + value / 
GeV );
 
  734 void  CexmcHistoManager::List( 
void )
 const 
  743     TObject *  histo( gDirectory->FindObjectAny( value.c_str() ) );
 
  747         G4cout << 
"Histogram '" << value << 
"' was not found" << 
G4endl;
 
  752     histo->Print( 
"range" );
 
  756 #ifdef CEXMC_USE_ROOTQT 
  758 void  CexmcHistoManager::Draw( 
const G4String &  histoName,
 
  761     if ( ! areLiveHistogramsEnabled )
 
  763         G4cout << 
"Live histograms option is disabled" << 
G4endl;
 
  767     TObject *  histo( gDirectory->FindObjectAny( histoName ) );
 
  771         G4cout << 
"Histogram '" << histoName << 
"' was not found" << 
G4endl;
 
  778         QFont  defaultAppFont( QApplication::font() );
 
  779         rootCanvas = 
new CexmcHistoWidget;
 
  780         QApplication::setFont( defaultAppFont );
 
  781         rootCanvas->resize( CexmcHistoCanvasWidth, CexmcHistoCanvasHeight );
 
  782         rootCanvas->GetCanvas()->cd();
 
  785     histo->Draw( histoDrawOptions );
 
  787     rootCanvas->GetCanvas()->Update();
 
  794     areLiveHistogramsEnabled = on;
 
  799     G4UIQt *  qtSession( dynamic_cast< G4UIQt * >( session ) );
 
  804     if ( ! histoMenuHandle.empty() && ! isHistoMenuInitialized )
 
  806         qtSession->AddMenu( histoMenuHandle, histoMenuLabel );
 
  807         BuildMenuTree( qtSession, histoMenuHandle, gDirectory->GetList() );
 
  808         isHistoMenuInitialized = 
true;
 
  813 void  CexmcHistoManager::BuildMenuTree( G4UIQt *  session,
 
  817     TObject *  obj( NULL );
 
  819     while ( ( obj = ( TObject * )objs() ) )
 
  824         if ( obj->IsFolder() )
 
  826             AddSubmenu( session, menu, name, title );
 
  827             BuildMenuTree( session, name, ( ( TDirectory * )obj )->GetList() );
 
  835                 if ( obj->InheritsFrom( TH3::Class() ) &&
 
  836                      ! drawOptions3D.empty() )
 
  839                     options += 
G4String( 
" " ) + drawOptions3D;
 
  842                 if ( obj->InheritsFrom( TH2::Class() ) &&
 
  843                      ! drawOptions2D.empty() )
 
  846                     options += 
G4String( 
" " ) + drawOptions2D;
 
  849                 if ( obj->InheritsFrom( TH1::Class() ) &&
 
  850                      ! drawOptions1D.empty() )
 
  852                     options += 
G4String( 
" " ) + drawOptions1D;
 
  857             G4String  cmd( CexmcMessenger::histoDirName + 
"draw " + options );
 
  858             session->AddButton( menu, title.c_str(), cmd );
 
  864 void  CexmcHistoManager::AddSubmenu( G4UIQt *  session,
 
  869   QMenu *  menu( 
new QMenu( label.c_str() ) );
 
  870   QMenu *  parentMenu( ( QMenu * )session->GetInteractor( parent ) );
 
  872   parentMenu->addMenu( menu );
 
const XML_Char const XML_Char * data
 
G4GLOB_DLL std::ostream G4cout
 
const XML_Char int const XML_Char * value
 
static constexpr double cm
 
void Print(const std::vector< T > &data)
 
static G4UIterminal * session
 
static G4RunManager * GetRunManager()
 
static constexpr double GeV
 
std::vector< CexmcAngularRange > CexmcAngularRangeList
 
static constexpr double MeV
 
static MCTruthManager * instance
 
void Add(G4int Elements, T *To, T *A1, T *A2=NULL)