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.16 2008/09/13 13:08:39 maire Exp $ >> 27 // GEANT4 tag $Name: geant4-09-02-patch-03 $ >> 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 = "root"; >> 57 fileOption = "--noErrors export=root 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 ascii[k] = false; >> 65 } >> 66 histoMessenger = new HistoMessenger(this); >> 67 } >> 68 >> 69 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... >> 70 >> 71 HistoManager::~HistoManager() >> 72 { >> 73 delete histoMessenger; >> 74 >> 75 #ifdef G4ANALYSIS_USE >> 76 delete af; >> 77 #endif >> 78 } >> 79 >> 80 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... >> 81 >> 82 void HistoManager::book() >> 83 { >> 84 #ifdef G4ANALYSIS_USE >> 85 if(!af) return; >> 86 >> 87 // Creating a tree mapped to an hbook file. >> 88 fileName[1] = fileName[0] + "." + fileType; >> 89 G4bool readOnly = false; >> 90 G4bool createNew = true; >> 91 AIDA::ITreeFactory* tf = af->createTreeFactory(); >> 92 tree = tf->create(fileName[1], fileType, readOnly, createNew, fileOption); >> 93 delete tf; >> 94 if(!tree) { >> 95 G4cout << "TestEm1::HistoManager::book :" >> 96 << " problem creating the AIDA tree with " >> 97 << " storeName = " << fileName[1] >> 98 << " storeType = " << fileType >> 99 << " readOnly = " << readOnly >> 100 << " createNew = " << createNew >> 101 << " options = " << fileOption >> 102 << G4endl; >> 103 return; >> 104 } >> 105 >> 106 // Creating a histogram factory, whose histograms will be handled by the tree >> 107 AIDA::IHistogramFactory* hf = af->createHistogramFactory(*tree); >> 108 >> 109 // create selected histograms >> 110 for (G4int k=1; k<MaxHisto; k++) { >> 111 if (exist[k]) { >> 112 histo[k] = hf->createHistogram1D( Label[k], Title[k], >> 113 Nbins[k], Vmin[k], Vmax[k]); >> 114 factoryOn = true; >> 115 } >> 116 } >> 117 delete hf; >> 118 if (factoryOn) >> 119 G4cout << "\n----> Histogram Tree is opened in " << fileName[1] << G4endl; >> 120 #endif >> 121 } >> 122 >> 123 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... >> 124 >> 125 void HistoManager::save() >> 126 { >> 127 #ifdef G4ANALYSIS_USE >> 128 if (factoryOn) { >> 129 saveAscii(); // Write ascii file, if any >> 130 tree->commit(); // Writing the histograms to the file >> 131 tree->close(); // and closing the tree (and the file) >> 132 G4cout << "\n----> Histogram Tree is saved in " << fileName[1] << G4endl; >> 133 >> 134 delete tree; >> 135 tree = 0; >> 136 factoryOn = false; >> 137 } >> 138 #endif 41 } 139 } 42 140 43 //....oooOO0OOooo........oooOO0OOooo........oo 141 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 44 142 45 void HistoManager::Book() << 143 void HistoManager::FillHisto(G4int ih, G4double xbin, G4double weight) 46 { 144 { 47 // Create or get analysis manager << 145 if (ih >= MaxHisto) { 48 // The choice of analysis technology is done << 146 G4cout << "---> warning from HistoManager::FillHisto() : histo " << ih 49 // in HistoManager.hh << 147 << " xbin= " << xbin << " weight= " << weight << G4endl; 50 G4AnalysisManager* analysisManager = G4Analy << 148 return; 51 analysisManager->SetDefaultFileType("root"); << 149 } 52 analysisManager->SetFileName(fFileName); << 150 #ifdef G4ANALYSIS_USE 53 analysisManager->SetVerboseLevel(1); << 151 if(exist[ih]) histo[ih]->fill(xbin/Unit[ih], weight); 54 analysisManager->SetActivation(true); // en << 152 #endif 55 << 153 } 56 // Define histograms start values << 154 57 << 155 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 58 const G4String id[] = {"0", "1", "2", "3" << 156 59 "9", "10", "11", "12 << 157 void HistoManager::SetHisto(G4int ih, 60 "18", "19", "20", "21 << 158 G4int nbins, G4double valmin, G4double valmax, const G4String& unit) >> 159 { >> 160 if (ih < 1 || ih >= MaxHisto) { >> 161 G4cout << "---> warning from HistoManager::SetHisto() : histo " << ih >> 162 << "does not exist" << G4endl; >> 163 return; >> 164 } >> 165 >> 166 // histo 1 : energy deposit in absorber 1 >> 167 // histo 2 : energy deposit in absorber 2 >> 168 // ...etc........... >> 169 // MaxAbsor = 10 (-1) >> 170 // >> 171 // histo 11 : longitudinal profile of energy deposit in absorber 1 (MeV) >> 172 // histo 12 : longitudinal profile of energy deposit in absorber 2 (MeV) >> 173 // ...etc........... >> 174 // >> 175 // histo 21 : energy flow (MeV) >> 176 // histo 22 : lateral energy leak (MeV) >> 177 >> 178 const G4String id[] = { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", >> 179 "10","11","12","13","14","15","16","17","18","19", >> 180 "20","21","22"}; >> 181 61 G4String title; 182 G4String title; >> 183 G4double vmin = valmin, vmax = valmax; >> 184 >> 185 if (ih < MaxAbsor) { >> 186 title = "Edep in absorber " + id[ih] + " (" + unit + ")"; >> 187 Unit[ih] = G4UnitDefinition::GetValueOf(unit); >> 188 vmin = valmin/Unit[ih]; vmax = valmax/Unit[ih]; >> 189 } else if (ih > MaxAbsor && ih < 2*MaxAbsor) { >> 190 title = "longit. profile of Edep (MeV/event) in absorber " >> 191 + id[ih-MaxAbsor]; >> 192 } else if (ih == 2*MaxAbsor+1) { >> 193 title = "energy flow (MeV/event)"; >> 194 } else if (ih == 2*MaxAbsor+2) { >> 195 title = "lateral energy leak (MeV/event)"; >> 196 } else return; >> 197 >> 198 exist[ih] = true; >> 199 Label[ih] = id[ih]; >> 200 Title[ih] = title; >> 201 Nbins[ih] = nbins; >> 202 Vmin[ih] = vmin; >> 203 Vmax[ih] = vmax; >> 204 Width[ih] = (valmax-valmin)/nbins; >> 205 >> 206 G4cout << "----> SetHisto " << ih << ": " << title << "; " >> 207 << nbins << " bins from " >> 208 << vmin << " " << unit << " to " << vmax << " " << unit << G4endl; >> 209 >> 210 } 62 211 63 // Default values (to be reset via /analysis << 212 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 64 G4int nbins = 100; << 213 65 G4double vmin = 0.; << 214 void HistoManager::Normalize(G4int ih, G4double fac) 66 G4double vmax = 100.; << 215 { 67 << 216 if (ih >= MaxHisto) { 68 // Create all histograms as inactivated << 217 G4cout << "---> warning from HistoManager::Normalize() : histo " << ih 69 // as we have not yet set nbins, vmin, vmax << 218 << " fac= " << fac << G4endl; 70 for (G4int k = 0; k < kMaxHisto; k++) { << 219 return; 71 if (k < kMaxAbsor) title = "Edep in absorb << 220 } 72 if (k == kMaxAbsor) title = "total energy << 221 #ifdef G4ANALYSIS_USE 73 if (k > kMaxAbsor) title = "Edep longit. p << 222 if(exist[ih]) histo[ih]->scale(fac); 74 if (k == 2 * kMaxAbsor + 1) title = "energ << 223 #endif 75 if (k == 2 * kMaxAbsor + 2) title = "later << 224 } 76 if (k == 2 * kMaxAbsor + 3) title = "total << 225 77 if (k == 2 * kMaxAbsor + 4) title = "total << 226 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 78 G4int ih = analysisManager->CreateH1(id[k] << 227 79 analysisManager->SetH1Activation(ih, false << 228 void HistoManager::RemoveHisto(G4int ih) >> 229 { >> 230 if (ih >= MaxHisto) { >> 231 G4cout << "---> warning from HistoManager::RemoveHisto() : histo " << ih >> 232 << "does not exist" << G4endl; >> 233 return; 80 } 234 } >> 235 >> 236 histo[ih] = 0; exist[ih] = false; 81 } 237 } >> 238 >> 239 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... >> 240 >> 241 void HistoManager::PrintHisto(G4int ih) >> 242 { >> 243 if (ih < MaxHisto) ascii[ih] = true; >> 244 else >> 245 G4cout << "---> warning from HistoManager::PrintHisto() : histo " << ih >> 246 << "does not exist" << G4endl; >> 247 } >> 248 >> 249 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... >> 250 >> 251 #include <fstream> >> 252 >> 253 void HistoManager::saveAscii() >> 254 { >> 255 #ifdef G4ANALYSIS_USE >> 256 >> 257 G4String name = fileName[0] + ".ascii"; >> 258 std::ofstream File(name, std::ios::out); >> 259 File.setf( std::ios::scientific, std::ios::floatfield ); >> 260 >> 261 //write selected histograms >> 262 for (G4int ih=0; ih<MaxHisto; ih++) { >> 263 if (exist[ih] && ascii[ih]) { >> 264 File << "\n 1D histogram " << ih << ": " << Title[ih] >> 265 << "\n \n \t X \t\t Y" << G4endl; >> 266 >> 267 for (G4int iBin=0; iBin<Nbins[ih]; iBin++) { >> 268 File << " " << iBin << "\t" >> 269 << 0.5*(histo[ih]->axis().binLowerEdge(iBin) + >> 270 histo[ih]->axis().binUpperEdge(iBin)) << "\t" >> 271 << histo[ih]->binHeight(iBin) >> 272 << G4endl; >> 273 } >> 274 } >> 275 } >> 276 #endif >> 277 } >> 278 >> 279 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... >> 280 >> 281 82 282