Geant4 Cross Reference |
1 // 1 // 2 // ******************************************* 2 // ******************************************************************** 3 // * License and Disclaimer 3 // * License and Disclaimer * 4 // * 4 // * * 5 // * The Geant4 software is copyright of th 5 // * The Geant4 software is copyright of the Copyright Holders of * 6 // * the Geant4 Collaboration. It is provided 6 // * the Geant4 Collaboration. It is provided under the terms and * 7 // * conditions of the Geant4 Software License 7 // * conditions of the Geant4 Software License, included in the file * 8 // * LICENSE and available at http://cern.ch/ 8 // * LICENSE and available at http://cern.ch/geant4/license . These * 9 // * include a list of copyright holders. 9 // * include a list of copyright holders. * 10 // * 10 // * * 11 // * Neither the authors of this software syst 11 // * Neither the authors of this software system, nor their employing * 12 // * institutes,nor the agencies providing fin 12 // * institutes,nor the agencies providing financial support for this * 13 // * work make any representation or warran 13 // * work make any representation or warranty, express or implied, * 14 // * regarding this software system or assum 14 // * regarding this software system or assume any liability for its * 15 // * use. Please see the license in the file 15 // * use. Please see the license in the file LICENSE and URL above * 16 // * for the full disclaimer and the limitatio 16 // * for the full disclaimer and the limitation of liability. * 17 // * 17 // * * 18 // * This code implementation is the result 18 // * This code implementation is the result of the scientific and * 19 // * technical work of the GEANT4 collaboratio 19 // * technical work of the GEANT4 collaboration. * 20 // * By using, copying, modifying or distri 20 // * By using, copying, modifying or distributing the software (or * 21 // * any work based on the software) you ag 21 // * any work based on the software) you agree to acknowledge its * 22 // * use in resulting scientific publicati 22 // * use in resulting scientific publications, and indicate your * 23 // * acceptance of all terms of the Geant4 Sof 23 // * acceptance of all terms of the Geant4 Software license. * 24 // ******************************************* 24 // ******************************************************************** 25 // 25 // 26 // << 26 // $Id: HistoManager.cc,v 1.13 2006/06/29 16:52:40 gunter Exp $ >> 27 // GEANT4 tag $Name: geant4-08-02 $ >> 28 // 27 //....oooOO0OOooo........oooOO0OOooo........oo 29 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 28 //....oooOO0OOooo........oooOO0OOooo........oo 30 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 29 31 30 #include "HistoManager.hh" 32 #include "HistoManager.hh" 31 << 33 #include "HistoMessenger.hh" 32 #include "DetectorConstruction.hh" << 33 << 34 #include "G4UnitsTable.hh" 34 #include "G4UnitsTable.hh" 35 35 >> 36 #ifdef G4ANALYSIS_USE >> 37 #include "AIDA/AIDA.h" >> 38 #endif >> 39 36 //....oooOO0OOooo........oooOO0OOooo........oo 40 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 37 41 38 HistoManager::HistoManager() 42 HistoManager::HistoManager() >> 43 :af(0),tree(0),factoryOn(false) 39 { 44 { 40 Book(); << 45 #ifdef G4ANALYSIS_USE >> 46 // Creating the analysis factory >> 47 af = AIDA_createAnalysisFactory(); >> 48 if(!af) { >> 49 G4cout << "TestEm1::HistoManager::HistoManager :" >> 50 << " problem creating the AIDA analysis factory." >> 51 << G4endl; >> 52 } >> 53 #endif >> 54 >> 55 fileName[0] = "testem3"; >> 56 fileType = "hbook"; >> 57 fileOption = "--noErrors uncompress"; >> 58 // histograms >> 59 for (G4int k=0; k<MaxHisto; k++) { >> 60 histo[k] = 0; >> 61 exist[k] = false; >> 62 Unit[k] = 1.0; >> 63 Width[k] = 1.0; >> 64 } >> 65 histoMessenger = new HistoMessenger(this); >> 66 } >> 67 >> 68 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... >> 69 >> 70 HistoManager::~HistoManager() >> 71 { >> 72 delete histoMessenger; >> 73 >> 74 #ifdef G4ANALYSIS_USE >> 75 delete af; >> 76 #endif >> 77 } >> 78 >> 79 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... >> 80 >> 81 void HistoManager::book() >> 82 { >> 83 #ifdef G4ANALYSIS_USE >> 84 if(!af) return; >> 85 >> 86 // Creating a tree mapped to an hbook file. >> 87 fileName[1] = fileName[0] + "." + fileType; >> 88 G4bool readOnly = false; >> 89 G4bool createNew = true; >> 90 AIDA::ITreeFactory* tf = af->createTreeFactory(); >> 91 tree = tf->create(fileName[1], fileType, readOnly, createNew, fileOption); >> 92 delete tf; >> 93 if(!tree) { >> 94 G4cout << "TestEm1::HistoManager::book :" >> 95 << " problem creating the AIDA tree with " >> 96 << " storeName = " << fileName[1] >> 97 << " storeType = " << fileType >> 98 << " readOnly = " << readOnly >> 99 << " createNew = " << createNew >> 100 << " options = " << fileOption >> 101 << G4endl; >> 102 return; >> 103 } >> 104 >> 105 // Creating a histogram factory, whose histograms will be handled by the tree >> 106 AIDA::IHistogramFactory* hf = af->createHistogramFactory(*tree); >> 107 >> 108 // create selected histograms >> 109 for (G4int k=1; k<MaxHisto; k++) { >> 110 if (exist[k]) { >> 111 histo[k] = hf->createHistogram1D( Label[k], Title[k], >> 112 Nbins[k], Vmin[k], Vmax[k]); >> 113 factoryOn = true; >> 114 } >> 115 } >> 116 delete hf; >> 117 if (factoryOn) >> 118 G4cout << "\n----> Histogram Tree is opened in " << fileName[1] << G4endl; >> 119 #endif 41 } 120 } 42 121 43 //....oooOO0OOooo........oooOO0OOooo........oo 122 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 44 123 45 void HistoManager::Book() << 124 void HistoManager::save() >> 125 { >> 126 #ifdef G4ANALYSIS_USE >> 127 if (factoryOn) { >> 128 tree->commit(); // Writing the histograms to the file >> 129 tree->close(); // and closing the tree (and the file) >> 130 G4cout << "\n----> Histogram Tree is saved in " << fileName[1] << G4endl; >> 131 >> 132 delete tree; >> 133 tree = 0; >> 134 factoryOn = false; >> 135 } >> 136 #endif >> 137 } >> 138 >> 139 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... >> 140 >> 141 void HistoManager::FillHisto(G4int ih, G4double xbin, G4double weight) 46 { 142 { 47 // Create or get analysis manager << 143 if (ih >= MaxHisto) { 48 // The choice of analysis technology is done << 144 G4cout << "---> warning from HistoManager::FillHisto() : histo " << ih 49 // in HistoManager.hh << 145 << " xbin= " << xbin << " weight= " << weight << G4endl; 50 G4AnalysisManager* analysisManager = G4Analy << 146 return; 51 analysisManager->SetDefaultFileType("root"); << 147 } 52 analysisManager->SetFileName(fFileName); << 148 #ifdef G4ANALYSIS_USE 53 analysisManager->SetVerboseLevel(1); << 149 if(exist[ih]) histo[ih]->fill(xbin/Unit[ih], weight); 54 analysisManager->SetActivation(true); // en << 150 #endif 55 << 151 } 56 // Define histograms start values << 152 57 << 153 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 58 const G4String id[] = {"0", "1", "2", "3" << 154 59 "9", "10", "11", "12 << 155 void HistoManager::SetHisto(G4int ih, 60 "18", "19", "20", "21 << 156 G4int nbins, G4double valmin, G4double valmax, const G4String& unit) >> 157 { >> 158 if (ih < 1 || ih >= MaxHisto) { >> 159 G4cout << "---> warning from HistoManager::SetHisto() : histo " << ih >> 160 << "does not exist" << G4endl; >> 161 return; >> 162 } >> 163 >> 164 // histo 1 : energy deposit in absorber 1 >> 165 // histo 2 : energy deposit in absorber 2 >> 166 // ...etc........... >> 167 // MaxAbsor = 10 (-1) >> 168 // >> 169 // histo 11 : longitudinal profile of energy deposit in absorber 1 (MeV) >> 170 // histo 12 : longitudinal profile of energy deposit in absorber 2 (MeV) >> 171 // ...etc........... >> 172 // >> 173 // histo 21 : energy flow (MeV) >> 174 // histo 22 : lateral energy leak (MeV) >> 175 >> 176 const G4String id[] = { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", >> 177 "10","11","12","13","14","15","16","17","18","19", >> 178 "20","21","22"}; >> 179 61 G4String title; 180 G4String title; >> 181 G4double vmin = valmin, vmax = valmax; >> 182 >> 183 if (ih < MaxAbsor) { >> 184 title = "Edep in absorber " + id[ih] + " (" + unit + ")"; >> 185 Unit[ih] = G4UnitDefinition::GetValueOf(unit); >> 186 vmin = valmin/Unit[ih]; vmax = valmax/Unit[ih]; >> 187 } else if (ih > MaxAbsor && ih < 2*MaxAbsor) { >> 188 title = "longit. profile of Edep (MeV/event) in absorber " >> 189 + id[ih-MaxAbsor]; >> 190 } else if (ih == 2*MaxAbsor+1) { >> 191 title = "energy flow (MeV/event)"; >> 192 } else if (ih == 2*MaxAbsor+2) { >> 193 title = "lateral energy leak (MeV/event)"; >> 194 } else return; >> 195 >> 196 exist[ih] = true; >> 197 Label[ih] = id[ih]; >> 198 Title[ih] = title; >> 199 Nbins[ih] = nbins; >> 200 Vmin[ih] = vmin; >> 201 Vmax[ih] = vmax; >> 202 Width[ih] = (valmax-valmin)/nbins; >> 203 >> 204 G4cout << "----> SetHisto " << ih << ": " << title << "; " >> 205 << nbins << " bins from " >> 206 << vmin << " " << unit << " to " << vmax << " " << unit << G4endl; >> 207 >> 208 } >> 209 >> 210 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... >> 211 >> 212 void HistoManager::Normalize(G4int ih, G4double fac) >> 213 { >> 214 if (ih >= MaxHisto) { >> 215 G4cout << "---> warning from HistoManager::Normalize() : histo " << ih >> 216 << " fac= " << fac << G4endl; >> 217 return; >> 218 } >> 219 #ifdef G4ANALYSIS_USE >> 220 if(exist[ih]) histo[ih]->scale(fac); >> 221 #endif >> 222 } >> 223 >> 224 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 62 225 63 // Default values (to be reset via /analysis << 226 void HistoManager::RemoveHisto(G4int ih) 64 G4int nbins = 100; << 227 { 65 G4double vmin = 0.; << 228 if (ih >= MaxHisto) { 66 G4double vmax = 100.; << 229 G4cout << "---> warning from HistoManager::RemoveHisto() : histo " << ih 67 << 230 << "does not exist" << G4endl; 68 // Create all histograms as inactivated << 231 return; 69 // as we have not yet set nbins, vmin, vmax << 70 for (G4int k = 0; k < kMaxHisto; k++) { << 71 if (k < kMaxAbsor) title = "Edep in absorb << 72 if (k == kMaxAbsor) title = "total energy << 73 if (k > kMaxAbsor) title = "Edep longit. p << 74 if (k == 2 * kMaxAbsor + 1) title = "energ << 75 if (k == 2 * kMaxAbsor + 2) title = "later << 76 if (k == 2 * kMaxAbsor + 3) title = "total << 77 if (k == 2 * kMaxAbsor + 4) title = "total << 78 G4int ih = analysisManager->CreateH1(id[k] << 79 analysisManager->SetH1Activation(ih, false << 80 } 232 } >> 233 >> 234 histo[ih] = 0; exist[ih] = false; 81 } 235 } >> 236 >> 237 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... >> 238 >> 239 82 240