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 /// \file eventgenerator/particleGun/src/Histo << 27 /// \brief Implementation of the HistoManager << 28 // 26 // 29 // << 27 // $Id: HistoManager.cc,v 1.1 2010-06-09 01:55:38 asaim Exp $ 30 //....oooOO0OOooo........oooOO0OOooo........oo << 28 // GEANT4 tag $Name: not supported by cvs2svn $ >> 29 // 31 //....oooOO0OOooo........oooOO0OOooo........oo 30 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... >> 31 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 32 32 33 #include "HistoManager.hh" 33 #include "HistoManager.hh" 34 << 34 #include "HistoMessenger.hh" 35 #include "G4UnitsTable.hh" 35 #include "G4UnitsTable.hh" 36 36 >> 37 #ifdef G4ANALYSIS_USE >> 38 #include "AIDA/AIDA.h" >> 39 #endif >> 40 37 //....oooOO0OOooo........oooOO0OOooo........oo 41 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 38 42 39 HistoManager::HistoManager() 43 HistoManager::HistoManager() >> 44 :af(0),tree(0),factoryOn(false) 40 { 45 { 41 Book(); << 46 #ifdef G4ANALYSIS_USE >> 47 // Creating the analysis factory >> 48 af = AIDA_createAnalysisFactory(); >> 49 if(!af) { >> 50 G4cout << " HistoManager::HistoManager() :" >> 51 << " problem creating the AIDA analysis factory." >> 52 << G4endl; >> 53 } >> 54 #endif >> 55 >> 56 fileName[0] = "particleGun"; >> 57 fileType = "root"; >> 58 fileOption = ""; >> 59 // histograms >> 60 for (G4int k=0; k<MaxHisto; k++) { >> 61 histo[k] = 0; >> 62 exist[k] = false; >> 63 Unit[k] = 1.0; >> 64 Width[k] = 1.0; >> 65 ascii[k] = false; >> 66 } >> 67 >> 68 histoMessenger = new HistoMessenger(this); 42 } 69 } 43 70 44 //....oooOO0OOooo........oooOO0OOooo........oo 71 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 45 72 46 void HistoManager::Book() << 73 HistoManager::~HistoManager() 47 { 74 { 48 // Create or get analysis manager << 75 delete histoMessenger; 49 // The choice of analysis technology is done << 76 50 // in HistoManager.hh << 77 #ifdef G4ANALYSIS_USE 51 G4AnalysisManager* analysisManager = G4Analy << 78 delete af; 52 analysisManager->SetDefaultFileType("root"); << 79 #endif 53 analysisManager->SetFileName(fFileName); << 80 } 54 analysisManager->SetVerboseLevel(1); << 81 55 analysisManager->SetActivation(true); // en << 82 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 56 << 83 57 // Define histograms start values << 84 void HistoManager::book() 58 const G4int kMaxHisto = 7; << 85 { 59 const G4String id[] = {"0", "1", "2", "3", " << 86 #ifdef G4ANALYSIS_USE 60 const G4String title[] = { << 87 if(!af) return; 61 "dummy", // 0 << 88 62 "energy spectrum dN/dE = f(E)", // 1 << 89 // Creating a tree mapped to an hbook file. 63 "vertex position: dN/dv = f(r)", // 2 << 90 fileName[1] = fileName[0] + "." + fileType; 64 "vertex position: cos(theta)", // 3 << 91 G4bool readOnly = false; 65 "vertex position: phi", // 4 << 92 G4bool createNew = true; 66 "particle direction in local frame: cos(al << 93 AIDA::ITreeFactory* tf = af->createTreeFactory(); 67 "particle direction in local frame: psi" << 94 tree = tf->create(fileName[1], fileType, readOnly, createNew, fileOption); 68 }; << 95 delete tf; 69 << 96 if(!tree) { 70 // Default values (to be reset via /analysis << 97 G4cout << "HistoManager::book() :" 71 G4int nbins = 100; << 98 << " problem creating the AIDA tree with " 72 G4double vmin = 0.; << 99 << " storeName = " << fileName[1] 73 G4double vmax = 100.; << 100 << " storeType = " << fileType 74 << 101 << " readOnly = " << readOnly 75 // Create all histograms as inactivated << 102 << " createNew = " << createNew 76 // as we have not yet set nbins, vmin, vmax << 103 << " options = " << fileOption 77 for (G4int k = 0; k < kMaxHisto; k++) { << 104 << G4endl; 78 G4int ih = analysisManager->CreateH1(id[k] << 105 return; 79 analysisManager->SetH1Activation(ih, false << 80 } 106 } >> 107 >> 108 // Creating a histogram factory, whose histograms will be handled by the tree >> 109 AIDA::IHistogramFactory* hf = af->createHistogramFactory(*tree); >> 110 >> 111 // create selected histograms >> 112 for (G4int k=0; k<MaxHisto; k++) { >> 113 if (exist[k]) { >> 114 histo[k] = hf->createHistogram1D( Label[k], Title[k], >> 115 Nbins[k], Vmin[k], Vmax[k]); >> 116 factoryOn = true; >> 117 } >> 118 } >> 119 delete hf; >> 120 if (factoryOn) >> 121 G4cout << "\n----> Histogram Tree is opened in " << fileName[1] << G4endl; >> 122 #endif >> 123 } >> 124 >> 125 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... >> 126 >> 127 void HistoManager::save() >> 128 { >> 129 #ifdef G4ANALYSIS_USE >> 130 if (factoryOn) { >> 131 saveAscii(); // Write ascii file, if any >> 132 tree->commit(); // Writing the histograms to the file >> 133 tree->close(); // and closing the tree (and the file) >> 134 G4cout << "\n----> Histogram Tree is saved in " << fileName[1] << G4endl; >> 135 >> 136 delete tree; >> 137 tree = 0; >> 138 factoryOn = false; >> 139 } >> 140 #endif 81 } 141 } 82 142 83 //....oooOO0OOooo........oooOO0OOooo........oo 143 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... >> 144 >> 145 void HistoManager::FillHisto(G4int ih, G4double e, G4double weight) >> 146 { >> 147 if (ih > MaxHisto) { >> 148 G4cout << "---> warning from HistoManager::FillHisto() : histo " << ih >> 149 << "does not exist; e= " << e << " w= " << weight << G4endl; >> 150 return; >> 151 } >> 152 #ifdef G4ANALYSIS_USE >> 153 if(exist[ih]) histo[ih]->fill(e/Unit[ih], weight); >> 154 #endif >> 155 } >> 156 >> 157 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... >> 158 >> 159 void HistoManager::SetHisto(G4int ih, >> 160 G4int nbins, G4double valmin, G4double valmax, const G4String& unit) >> 161 { >> 162 if (ih > MaxHisto) { >> 163 G4cout << "---> warning from HistoManager::SetHisto() : histo " << ih >> 164 << "does not exist" << G4endl; >> 165 return; >> 166 } >> 167 >> 168 const G4String id[] = { "0", "1", "2", "3", "4", "5", "6", "7", "8" }; >> 169 const G4String title[] = >> 170 { "dummy", //0 >> 171 "energy spectrum dN/dE = f(E)", //1 for GunAction #2 >> 172 "moment dir: angular distr dN/dOmega = f(alpha) ", //2 for GunAction #2 >> 173 "moment dir: angular distr dN/dOmega = f(psi) ", //3 for GunAction #2 >> 174 "vertex posi: radial distr dN/dv = f(r)", //4 for GunAction #3 >> 175 "vertex posi: angular distr dN/dv = f(theta)", //5 for GunAction #3 >> 176 "vertex posi: angular distr dN/dv = f(phi)", //6 for GunAction #3 >> 177 "moment dir: angular distr dN/dOmega = f(alpha) ", //7 for GunAction #3 >> 178 "moment dir: angular distr dN/dOmega = f(psi) " //8 for GunAction #3 >> 179 }; >> 180 >> 181 >> 182 G4String titl = title[ih]; >> 183 G4double vmin = valmin, vmax = valmax; >> 184 Unit[ih] = 1.; >> 185 >> 186 if (unit != "none") { >> 187 titl = title[ih] + " (" + unit + ")"; >> 188 Unit[ih] = G4UnitDefinition::GetValueOf(unit); >> 189 vmin = valmin/Unit[ih]; vmax = valmax/Unit[ih]; >> 190 } >> 191 >> 192 exist[ih] = true; >> 193 Label[ih] = id[ih]; >> 194 Title[ih] = titl; >> 195 Nbins[ih] = nbins; >> 196 Vmin[ih] = vmin; >> 197 Vmax[ih] = vmax; >> 198 Width[ih] = (valmax-valmin)/nbins; >> 199 >> 200 G4cout << "----> SetHisto " << ih << ": " << titl << "; " >> 201 << nbins << " bins from " >> 202 << vmin << " " << unit << " to " << vmax << " " << unit << G4endl; >> 203 >> 204 } >> 205 >> 206 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... >> 207 >> 208 void HistoManager::RemoveHisto(G4int ih) >> 209 { >> 210 if (ih > MaxHisto) { >> 211 G4cout << "---> warning from HistoManager::RemoveHisto() : histo " << ih >> 212 << "does not exist" << G4endl; >> 213 return; >> 214 } >> 215 >> 216 histo[ih] = 0; exist[ih] = false; >> 217 } >> 218 >> 219 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... >> 220 >> 221 void HistoManager::PrintHisto(G4int ih) >> 222 { >> 223 if (ih < MaxHisto) { ascii[ih] = true; ascii[0] = true; } >> 224 else >> 225 G4cout << "---> warning from HistoManager::PrintHisto() : histo " << ih >> 226 << "does not exist" << G4endl; >> 227 } >> 228 >> 229 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... >> 230 >> 231 #include <fstream> >> 232 >> 233 void HistoManager::saveAscii() >> 234 { >> 235 #ifdef G4ANALYSIS_USE >> 236 >> 237 if (!ascii[0]) return; >> 238 >> 239 G4String name = fileName[0] + ".ascii"; >> 240 std::ofstream File(name, std::ios::out); >> 241 File.setf( std::ios::scientific, std::ios::floatfield ); >> 242 >> 243 //write selected histograms >> 244 for (G4int ih=0; ih<MaxHisto; ih++) { >> 245 if (exist[ih] && ascii[ih]) { >> 246 File << "\n 1D histogram " << ih << ": " << Title[ih] >> 247 << "\n \n \t X \t\t Y" << G4endl; >> 248 >> 249 for (G4int iBin=0; iBin<Nbins[ih]; iBin++) { >> 250 File << " " << iBin << "\t" >> 251 << 0.5*(histo[ih]->axis().binLowerEdge(iBin) + >> 252 histo[ih]->axis().binUpperEdge(iBin)) << "\t" >> 253 << histo[ih]->binHeight(iBin) >> 254 << G4endl; >> 255 } >> 256 } >> 257 } >> 258 #endif >> 259 } >> 260 >> 261 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... >> 262 84 263