Files
geant4/examples/advanced/Rich/src/AerogelRefData.cc
T
2016-06-09 10:41:53 +02:00

200 lines
6.5 KiB
C++

//
// ********************************************************************
// * DISCLAIMER *
// * *
// * The following disclaimer summarizes all the specific disclaimers *
// * of contributors to this software. The specific disclaimers,which *
// * govern, are listed with their locations in: *
// * http://cern.ch/geant4/license *
// * *
// * Neither the authors of this software system, nor their employing *
// * institutes,nor the agencies providing financial support for this *
// * work make any representation or warranty, express or implied, *
// * regarding this software system or assume any liability for its *
// * use. *
// * *
// * This code implementation is the intellectual property of the *
// * GEANT4 collaboration. *
// * By copying, distributing or modifying the Program (or any work *
// * based on the Program) you indicate your acceptance of this *
// * statement, and all its terms. *
// ********************************************************************
//
// Rich advanced example for Geant4
// AerogelRefData.cc for Rich of LHCb
// History:
// Created: Sajan Easo (Sajan.Easo@cern.ch)
// Revision and changes: Patricia Mendez (Patricia.Mendez@cern.ch)
/////////////////////////////////////////////////////////////////////////////
#include <iostream.h>
#include <fstream.h>
#include "AerogelRefData.hh"
#include "RichTbGeometryParameters.hh"
#include "RichTbMaterialParameters.hh"
AerogelRefData::AerogelRefData(G4String AgelRefIndFile)
:NumberOfRefIndBins(NumAerogelRefIndexPhotonEnergyBins),
StdAerogelRefphotE(vector<G4double>(NumAerogelRefIndexPhotonEnergyBins)),
StdAerogelRefIndexValue(vector<G4double>(NumAerogelRefIndexPhotonEnergyBins)),
AerogelRefIndShift(vector<G4double>( MaxNumberOfAerogelTypes)),
AerogelWavelengthRef(vector<G4double>( MaxNumberOfAerogelTypes)) {
AerogelRefIndexFileName=AgelRefIndFile;
StdAerogelNominalRefractiveIndex= StdAerogelNominalRefIndex;
ReadStdAerogelRefIndex();
G4double AerogelRefEnergy,AerogelReferenceRefInd;
for(G4int ityp=0; ityp< MaxNumberOfAerogelTypes; ityp++ ){
AerogelWavelengthRef[ityp]=AerogelReferenceRefIndWavelength[ityp];
AerogelRefEnergy=
(PhotMomWaveConv/(AerogelWavelengthRef[ityp]/nanometer))*eV;
AerogelReferenceRefInd = GetStdAgelRefIndexE(AerogelRefEnergy);
AerogelRefIndShift[ityp] = AerogelReferenceRefInd -
StdAerogelNominalRefractiveIndex ;
}
}
G4double AerogelRefData::GetStdAgelRefIndexE(G4double StdAgelRefEnergy) {
G4double refint= StdAerogelNominalRefractiveIndex;
if(StdAgelRefEnergy <= StdAerogelRefphotE[0] ) {
refint= StdAerogelRefphotE[0];
G4cout<<"Ref index reference value outside bounds "<<G4endl;
}
if(StdAgelRefEnergy > StdAerogelRefphotE[ NumberOfRefIndBins-1 ] ) {
refint= StdAerogelRefphotE[ NumberOfRefIndBins-1 ];
G4cout<<"Ref index reference value outside bounds "<<G4endl;
}
for(G4int iabin=0; iabin < NumberOfRefIndBins-1 ; iabin++ ){
G4double E1= StdAerogelRefphotE[iabin];
G4double E2= StdAerogelRefphotE[iabin+1];
if(StdAgelRefEnergy > E1 && StdAgelRefEnergy <= E2 && E1 != E2 ){
//Now interpolate
G4double r1= StdAerogelRefIndexValue[iabin];
G4double r2= StdAerogelRefIndexValue[iabin+1];
G4double slp=(r2-r1)/(E2-E1);
G4double ain= r1-slp*E1;
refint= slp*StdAgelRefEnergy + ain;
break;
}
}
return refint;
}
void AerogelRefData::ReadStdAerogelRefIndex() {
const char* StdAerogelRefIndFile= AerogelRefIndexFileName.c_str();
if( StdAerogelRefIndFile == 0 ){
G4cout<<" Aerogel RefIndex Input file missing"
<< " Please provide the correct file name "
<<G4endl;
}else {
G4cout<<"Now reading Std Aerogel Ref Index from "
<<StdAerogelRefIndFile<<G4endl;
ifstream finpga(StdAerogelRefIndFile);
G4double ephot,rind;
for (G4int fbin=0; fbin< NumberOfRefIndBins ; fbin++){
finpga>>ephot;
finpga>>rind;
StdAerogelRefphotE[fbin]=ephot*eV;
StdAerogelRefIndexValue[fbin]=rind;
//for test avoid the variation in ref index. SE 18-10-01
// StdAerogelRefIndexValue[fbin]= StdAerogelNominalRefractiveIndex;
}
}
}
vector<G4double> AerogelRefData::GetCurAerogelRefIndValueVect (G4int AerogelTnum ) {
// no test for tdr rich. now put back to TB conditions.
vector<G4double>CAgel(NumberOfRefIndBins);
// AerogelType Ctype;
G4double CRn = GetRefnominal( AerogelTnum );
for (G4int ib=0; ib < NumberOfRefIndBins; ib++ ){
CAgel[ib]= StdAerogelRefIndexValue[ib]
- StdAerogelNominalRefractiveIndex-AerogelRefIndShift[ AerogelTnum] + CRn;
}
return CAgel;
}
G4double AerogelRefData:: GetCurAerogelRefIndValue( G4int rbinw , G4int AerogelTnum ){
// no test for tdr. now in TB conditions.
G4double crn= GetRefnominal( AerogelTnum );
return StdAerogelRefIndexValue[rbinw]
- StdAerogelNominalRefractiveIndex-AerogelRefIndShift[ AerogelTnum] +crn;
// - StdAerogelNominalRefractiveIndex-AerogelRefIndShift[ AerogelTnum] +crn;
// return StdAerogelRefIndexValue[rbinw]-1.03269+crn;
}
G4double AerogelRefData::GetRefnominal(G4int AgelTnum ) {
G4double CRnominal = StdAerogelNominalRefractiveIndex;
if(AgelTnum == 0 ){
CRnominal= AerogelTypeANominalRefIndex;
}else if (AgelTnum == 1 ) {
CRnominal= AerogelTypeBNominalRefIndex;
}else if (AgelTnum == 2 ) {
CRnominal= AerogelTypeCNominalRefIndex;
}else if (AgelTnum == 3 ) {
CRnominal= AerogelTypeDNominalRefIndex;
}else if (AgelTnum == 4 ) {
CRnominal= AerogelTypeENominalRefIndex;
} else {G4cout<<"Unknown Aerogel Type "<<G4endl; }
return CRnominal;
}
AerogelType AerogelRefData::GetAerogelType(G4int AgelTnum ) {
AerogelType Ctype=AerogelTypeA;
if(AgelTnum == 0 ){
Ctype=AerogelTypeA;
}else if (AgelTnum == 1 ) {
Ctype=AerogelTypeB;
}else if (AgelTnum == 2 ) {
Ctype=AerogelTypeC;
}else if (AgelTnum == 3 ) {
Ctype=AerogelTypeD;
}else if (AgelTnum == 4 ) {
Ctype=AerogelTypeE;
} else {G4cout<<"Unknown Aerogel Type "<<G4endl; }
return Ctype;
}
AerogelRefData::~AerogelRefData(){ ; }