source: trunk/examples/advanced/Rich/src/RichTbMaterialParameters.cc @ 1282

Last change on this file since 1282 was 807, checked in by garnier, 16 years ago

update

File size: 7.7 KB
Line 
1//
2// ********************************************************************
3// * License and Disclaimer                                           *
4// *                                                                  *
5// * The  Geant4 software  is  copyright of the Copyright Holders  of *
6// * the Geant4 Collaboration.  It is provided  under  the terms  and *
7// * conditions of the Geant4 Software License,  included in the file *
8// * LICENSE and available at  http://cern.ch/geant4/license .  These *
9// * include a list of copyright holders.                             *
10// *                                                                  *
11// * Neither the authors of this software system, nor their employing *
12// * institutes,nor the agencies providing financial support for this *
13// * work  make  any representation or  warranty, express or implied, *
14// * regarding  this  software system or assume any liability for its *
15// * use.  Please see the license in the file  LICENSE  and URL above *
16// * for the full disclaimer and the limitation of liability.         *
17// *                                                                  *
18// * This  code  implementation is the result of  the  scientific and *
19// * technical work of the GEANT4 collaboration.                      *
20// * By using,  copying,  modifying or  distributing the software (or *
21// * any work based  on the software)  you  agree  to acknowledge its *
22// * use  in  resulting  scientific  publications,  and indicate your *
23// * acceptance of all terms of the Geant4 Software license.          *
24// ********************************************************************
25//
26// Rich advanced example for Geant4
27// RichTbMaterialParameters.cc for Rich of LHCb
28// History:
29// Created: Sajan Easo (Sajan.Easo@cern.ch)
30// Revision and changes: Patricia Mendez (Patricia.Mendez@cern.ch)
31/////////////////////////////////////////////////////////////////////////////
32#include <iostream>
33#include <fstream>
34#include "globals.hh"
35#include "RichTbGeometryParameters.hh"
36#include "RichTbMaterialParameters.hh"
37#include "FilterTrData.hh"
38#include "AerogelTypeSpec.hh"
39
40#include "RichTbAnalysisManager.hh"
41
42
43void InitializeRichTbMaterial(){
44
45}
46
47std::vector<G4double> InitializePhotonMomentumVector() {
48
49  G4double PhotonEnergyStep=(PhotonMaxEnergy-PhotonMinEnergy)/
50                            NumPhotWaveLengthBins;
51  std::vector<G4double>PhotMomVect(NumPhotWaveLengthBins);
52  for (G4int ibin=0; ibin<NumPhotWaveLengthBins; ibin++){
53    PhotMomVect[ibin]=PhotonMinEnergy+PhotonEnergyStep*ibin;
54  }
55  return PhotMomVect;
56}
57std::vector<G4double> InitN2RefIndex(G4double pressure, G4double temperature){
58 
59  std::vector<G4double> PmV=InitN2RefPhotW();
60  std::vector<G4double> RefN2(NumPhotWaveLengthBins);
61  G4double GasRhoN2Cur=GasRhoN2atSTP*(GasTemperature_STP/temperature)*
62                                     (pressure/ GasPressure_STP);
63  G4double epho,pfe,cpfe;
64  for(G4int ibinwn =0; ibinwn<NumPhotWaveLengthBins ; ibinwn++ ){
65
66    epho = PmV[ibinwn]/eV;
67    pfe  = SellN2F1/(SellN2E1*SellN2E1 - epho*epho )  +
68      SellN2F2/(SellN2E2*SellN2E2 - epho*epho );
69    cpfe=0.3738*(GasRhoN2Cur/GasMolWeightN2)*pfe;
70    RefN2[ibinwn]=std::pow((1.0+2*cpfe)/(1.0-cpfe),0.5); 
71  }
72  return RefN2;
73}
74std::vector<G4double> InitN2RefPhotW() {
75  return InitializePhotonMomentumVector() ; 
76} 
77std::vector<G4double> InitAgelPhotW() {
78  return InitializePhotonMomentumVector() ; 
79}
80std::vector<G4double> InitializeHpdQE(G4int ihpdqe) {
81  // Initialize the HPD QE
82   G4int iqb;
83   if(ihpdqe >= NumHpdTot ) {
84     G4cout<<"Wrong HPD Number for QE " <<ihpdqe<<"  vs "
85         <<NumHpdTot <<G4endl;
86   }
87   std::vector<G4double>qeCurPerCent(NumQEbins);
88   if(ihpdqe == 0 ){
89    for(iqb=0; iqb<NumQEbins; iqb++){
90      qeCurPerCent[iqb] =  Hpd0QEPerCent[iqb]* HpdQEReductionFactor;
91   } 
92  }
93  if(ihpdqe == 1 ){
94    for(iqb=0; iqb<NumQEbins; iqb++){
95      qeCurPerCent[iqb] =  Hpd1QEPerCent[iqb]* HpdQEReductionFactor;
96    } 
97  }
98  if(ihpdqe == 2 ){
99    for(iqb=0; iqb<NumQEbins; iqb++){
100      qeCurPerCent[iqb] =  Hpd2QEPerCent[iqb]* HpdQEReductionFactor;
101    } 
102  }
103  if(ihpdqe == 3 ){
104    for(iqb=0; iqb<NumQEbins; iqb++){
105      qeCurPerCent[iqb] =  Hpd3QEPerCent[iqb]* HpdQEReductionFactor;
106    } 
107  }
108
109 return  qeCurPerCent;
110}
111std::vector<G4double> InitializeHpdWaveL(G4int ihpdqe) {
112  G4int iqb;
113 if(ihpdqe >= NumHpdTot ) {
114   G4cout<<"Wrong HPD Number for QE wavelength " <<ihpdqe<<"  vs "
115         <<NumHpdTot <<G4endl;
116 }
117 // for now all HPDs have the same wavelength bins.
118 std::vector<G4double>HpdQEW(NumQEbins);
119 for (iqb=0; iqb<NumQEbins; iqb++){
120   HpdQEW[iqb]= HpdQEWaveL[iqb];
121 } 
122 return HpdQEW;
123}
124
125void  HistoRichTbMaterialProperties(RichTbRunConfig* RConfig) {
126
127
128  G4int AerogelNum=0;
129  G4double waL=200;
130
131  G4double stepsize=7.0;
132
133  // G4double thickness=(GetCurAerogelLength(AerogelNum))/cm;
134  AerogelType CurAerogelType=RConfig-> GetCurAerogelType(AerogelNum);
135
136
137
138  G4double Aparam=0.;
139  G4double Cparam=0.;
140  if(CurAerogelType == AerogelTypeA ) {
141    Aparam =   AerogelTypeATotTrans;
142    Cparam =  AerogelTypeAClarity*cm/(micrometer*micrometer*micrometer*micrometer);
143   }
144
145
146 
147  for(G4int Iabin=0; Iabin<100; Iabin ++ ) {
148   
149    // G4double waLInmu = waL/1000.0;
150    // G4double Aetr = Aparam* std::exp(-Cparam * thickness / std::pow(waLInmu,4) );
151
152    waL += stepsize;
153  }
154
155
156
157
158
159
160  G4int ihpdqa;
161  ihpdqa=0;
162  std::vector<G4double>WaveL1 = InitializeHpdWaveL(ihpdqa); 
163  std::vector<G4double>QEff1 = InitializeHpdQE(ihpdqa);
164
165
166
167}
168 
169
170std::vector<G4int> getDeadPixelList(G4int ihpdNum,  G4int){
171  std::vector<G4int>DeadPixelList;
172  // G4int isc,ipsc;
173
174
175  if(G4int(DeadPixelList.size()) >  MaxNumDeadPixelPerHpdSect ){
176    G4cout<<" Too Many dead Pixels in Hpd "<<DeadPixelList.size()
177          <<"   in Hpd "<<ihpdNum<<G4endl;
178  }
179
180  return DeadPixelList;
181}
182std::vector<G4double>GetAerogelRScatLength(AerogelType CurrentAerogelType) {
183
184  std::vector<G4double>AgelRayleighScatLength(NumPhotWaveLengthBins);
185  std::vector<G4double>AgelPhotW = InitAgelPhotW();
186  G4double aClarity=0.;
187  if(CurrentAerogelType == AerogelTypeA ) {
188    aClarity=AerogelTypeAClarity/(micrometer*micrometer*micrometer*micrometer);
189   
190  }else if (CurrentAerogelType == AerogelTypeB ) {
191    aClarity=AerogelTypeBClarity/(micrometer*micrometer*micrometer*micrometer);
192  }else if (CurrentAerogelType == AerogelTypeC ) {
193    aClarity=AerogelTypeCClarity/(micrometer*micrometer*micrometer*micrometer);
194
195
196  }else if (CurrentAerogelType == AerogelTypeD ) {
197    aClarity=AerogelTypeDClarity/(micrometer*micrometer*micrometer*micrometer);
198
199  }else if (CurrentAerogelType == AerogelTypeE ) {
200    aClarity=AerogelTypeEClarity/(micrometer*micrometer*micrometer*micrometer);
201
202  }else {G4cout<<"Unknown Aerogel Type for Rayleigh Scat Length "<<G4endl; }
203
204  if(aClarity != 0.0 ) {   
205    for(G4int ibinw=0; ibinw<NumPhotWaveLengthBins; ibinw++ ){
206      G4double ephoton=AgelPhotW[ibinw]/eV;
207      //In the following the 1000 is to convert form nm to micrometer
208      G4double wphoton=(PhotMomWaveConv/ephoton)/1000.0;
209      AgelRayleighScatLength[ibinw]=(std::pow(wphoton,4))/aClarity;
210 
211    }
212  }
213
214  return  AgelRayleighScatLength;
215}
216G4double GetCurrentBulkTrans(G4double currentMatRefIndex, 
217                          G4double currentNeighbourRefIndex,
218                          G4double MaxTotMeasuredTransmission){
219  G4double ATrans=MaxTotMeasuredTransmission;
220  // G4double ePhot;
221  // in the following the energy of the photon is not used since
222  // it is only an approximate calulation.
223  G4double na=  currentMatRefIndex;
224  G4double nb=  currentNeighbourRefIndex;
225  G4double LossAtEntrance=std::pow(((na-nb)/(na+nb)),2.0);
226  G4double LossAtExit=std::pow(((nb-na)/(nb+na)),2.0);
227 
228  G4double LightLossAtExternalSurface= LossAtEntrance+ LossAtExit;
229 
230  ATrans += LightLossAtExternalSurface;
231  if(ATrans >= 1.0) ATrans=1.0;
232  return ATrans;
233}
234
235
236
237
238
Note: See TracBrowser for help on using the repository browser.