// ----------------------------------------------------------------------------
// $Id: LCDGetParameters.cxx,v 1.2 2001/06/23 16:14:14 toshi Exp $
// ----------------------------------------------------------------------------
//
// $Log: LCDGetParameters.cxx,v $
// Revision 1.2 2001/06/23 16:14:14 toshi
// Char_t* -> const Char_t*
//
// Revision 1.1 2001/05/10 20:39:55 toshi
// C++ file name convention has been changed from *.C to *.cxx .
//
//
#include "LCDGetParameters.h"
#include <stdlib.h>
//______________________________________________________________________
// LCDGetParameters
//
ClassImp(LCDGetParameters)
LCDGetParameters::LCDGetParameters() {
m_Field=0;
m_ipSigmaX=0;
m_ipSigmaY=0;
m_ipSigmaZ=0;
m_minHit=0;
m_PtMin=0;
m_PolarInner=0;
m_PolarOuter=0;
m_CalEnergyEMA=0;
m_CalEnergyEMB=0;
m_CalEnergyHADA=0;
m_CalEnergyHADB=0;
m_CalTransEMA=0;
m_CalTransEMB=0;
m_CalTransHADA=0;
m_CalTransHADB=0;
m_EMEnergyScale=1;
m_HADEnergyScale=1;
m_MUEnergyScale=1;
m_LUMEnergyScale=1;
m_EMThetaSeg=0;
m_HADThetaSeg=0;
m_MUThetaSeg=0;
m_LUMThetaSeg=0;
m_EMphiSeg=0;
m_HADphiSeg=0;
m_MUphiSeg=0;
m_LUMphiSeg=0;
m_EMBarrelInnerR=0;
m_HADBarrelInnerR=0;
m_MUBarrelInnerR=0;
m_EMBarrelOuterR=0;
m_HADBarrelOuterR=0;
m_MUBarrelOuterR=0;
m_EMBarrelOuterZ=0;
m_HADBarrelOuterZ=0;
m_MUBarrelOuterZ=0;
m_EMBarrelLayer=0;
m_HADBarrelLayer=0;
m_MUBarrelLayer=0;
m_EMBarrelThick=0;
m_HADBarrelThick=0;
m_MUBarrelThick=0;
m_EMBarrelAbsThick=0;
m_HADBarrelAbsThick=0;
m_MUBarrelAbsThick=0;
m_EMEndcapInnerZ=0;
m_HADEndcapInnerZ=0;
m_MUEndcapInnerZ=0;
m_EMEndcapLayer=0;
m_HADEndcapLayer=0;
m_MUEndcapLayer=0;
m_EMEndcapThick=0;
m_HADEndcapThick=0;
m_MUEndcapThick=0;
m_CoilInnerR=0;
m_CoilOuterZ=0;
m_CoilThick=0;
m_CoilIntLeng=0;
m_PipeOuter=0;
m_DetectorName="";
m_CoilPlace="";
m_EMBarrelAbsMat="";
m_HADBarrelAbsMat="";
m_MUBarrelAbsMat="";
m_Volumes=0;
m_InnerVolume=0;
m_nVolumes=0;
}
LCDGetParameters::LCDGetParameters(FILE* parFile):
m_Volumes(0),m_InnerVolume(0),m_nVolumes(0)
{
SetDetectorGeomFile(parFile);
}
void LCDGetParameters::SetDetectorGeomFile(FILE* parFile) {
TString input_line, input_string;
Char_t temp[100];
Char_t name[100];
Char_t equals[100];
Double_t read_value = 0.;
Int_t pos;
// rewind the file
fseek(parFile, 0L, 0);
Int_t inpos;
while ( (pos = fscanf(parFile,"%s",&temp[0])) > 0 ) {
input_line = temp;
if(input_line.Contains("Detector:")) {
// form of parameters is: name = read_value
while( (inpos = fscanf(parFile,"%s",&name[0]) ) > 0) {
input_string = name;
if ( input_string.Contains("end")) break;
inpos = fscanf(parFile,"%s %s",&equals[0],&temp[0]);
if ( input_string.Contains("DetectorName" )) {
m_DetectorName = temp;
}
}
}
if(input_line.Contains("IP:")) {
// form of parameters is: name = read_value
while( (inpos =fscanf(parFile,"%s",&name[0]) ) > 0){
input_string = name;
if ( input_string.Contains("end")) break;
inpos = fscanf(parFile,"%s %s",&equals[0],&temp[0]);
read_value = strtod(temp,(Char_t**)NULL);
if ( input_string.Contains("IPsigmaX" )) {
m_ipSigmaX = read_value;
} else if ( input_string.Contains("IPsigmaY" )) {
m_ipSigmaY = read_value;
} else if ( input_string.Contains("IPsigmaZ" )) {
m_ipSigmaZ = read_value;
}
}
}
if(input_line.Contains("Tracking:")) {
// form of parameters is: name = read_value
while( (inpos =fscanf(parFile,"%s",&name[0]) ) > 0){
input_string = name;
if ( input_string.Contains("end")) break;
inpos = fscanf(parFile,"%s %s",&equals[0],&temp[0]);
read_value = strtod(temp,(Char_t**)NULL);
if ( input_string.Contains("minHit" )) {
m_minHit = (Int_t) read_value;
} else if ( input_string.Contains("PtMin" )) {
m_PtMin = read_value;
} else if ( input_string.Contains("PolarInner" )) {
m_PolarInner = read_value;
} else if ( input_string.Contains("PolarOuter" )) {
m_PolarOuter = read_value;
} else if ( input_string.Contains("Magnetic_Field" )) {
m_Field = read_value;
}
}
}
if(input_line.Contains("CalSmearParam:")) {
// form of parameters is: name = read_value
while( (inpos =fscanf(parFile,"%s",&name[0]) ) > 0){
input_string = name;
if ( input_string.Contains("end")) break;
inpos = fscanf(parFile,"%s %s",&equals[0],&temp[0]);
read_value = strtod(temp,(Char_t**)NULL);
if ( input_string.Contains("CalEnergyEM_A" )) {
m_CalEnergyEMA = read_value;
} else if ( input_string.Contains("CalEnergyEM_B" )) {
m_CalEnergyEMB = read_value;
} else if ( input_string.Contains("CalEnergyHAD_A" )) {
m_CalEnergyHADA = read_value;
} else if ( input_string.Contains("CalEnergyHAD_B" )) {
m_CalEnergyHADB = read_value;
} else if ( input_string.Contains("CalTransEM_A" )) {
m_CalTransEMA = read_value;
} else if ( input_string.Contains("CalTransEM_B" )) {
m_CalTransEMB = read_value;
} else if ( input_string.Contains("CalTransHAD_A" )) {
m_CalTransHADA = read_value;
} else if ( input_string.Contains("CalTransHAD_B" )) {
m_CalTransHADB = read_value;
}
}
}
if (input_line.Contains("CalMergeParam:")) {
// form of parameters is: name = read_value
while( (inpos =fscanf(parFile,"%s",&name[0]) ) > 0){
input_string = name;
if ( input_string.Contains("end")) break;
inpos = fscanf(parFile,"%s %s",&equals[0],&temp[0]);
read_value = strtod(temp,(Char_t**)NULL);
if ( input_string.Contains("CalMergeSize_EM" )) {
m_EMMergeSize = read_value;
} else if ( input_string.Contains("CalMergeAngle_EM" )) {
m_EMMergeAngle = read_value;
} else if ( input_string.Contains("CalMergeSize_HAD" )) {
m_HADMergeSize = read_value;
} else if ( input_string.Contains("CalMergeAngle_HAD" )) {
m_HADMergeAngle = read_value;
}
}
}
if(input_line.Contains("Calorimeter:")) {
// form of parameters is: name = read_value
while( (inpos =fscanf(parFile,"%s",&name[0]) ) > 0){
input_string = name;
if ( input_string.Contains("end")) break;
inpos = fscanf(parFile,"%s %s",&equals[0],&temp[0]);
if ( input_string.Contains("EMBarrelAbsMat" )) {
m_EMBarrelAbsMat = temp;
} else if ( input_string.Contains("HADBarrelAbsMat" )) {
m_HADBarrelAbsMat = temp;
} else if ( input_string.Contains("MUBarrelAbsMat" )) {
m_MUBarrelAbsMat = temp;
} else{
read_value = strtod(temp,(Char_t**)NULL);
if ( input_string.Contains("EMEnergyScale" )) {
m_EMEnergyScale = read_value;
} else if ( input_string.Contains("HADEnergyScale" )) {
m_HADEnergyScale = read_value;
} else if ( input_string.Contains("MUEnergyScale" )) {
m_MUEnergyScale = read_value;
} else if ( input_string.Contains("LUMEnergyScale" )) {
m_LUMEnergyScale = read_value;
} else if ( input_string.Contains("EMThetaSeg" )) {
m_EMThetaSeg = read_value;
} else if ( input_string.Contains("HADThetaSeg" )) {
m_HADThetaSeg = read_value;
} else if ( input_string.Contains("MUThetaSeg" )) {
m_MUThetaSeg = read_value;
} else if ( input_string.Contains("LUMphiSeg" )) {
m_LUMphiSeg = read_value;
} else if ( input_string.Contains("EMphiSeg" )) {
m_EMphiSeg = read_value;
} else if ( input_string.Contains("HADphiSeg" )) {
m_HADphiSeg = read_value;
} else if ( input_string.Contains("MUphiSeg" )) {
m_MUphiSeg = read_value;
} else if ( input_string.Contains("LUMphiSeg" )) {
m_LUMphiSeg = read_value;
} else if ( input_string.Contains("EMBarrelInnerR" )) {
m_EMBarrelInnerR = read_value;
} else if ( input_string.Contains("HADBarrelInnerR" )) {
m_HADBarrelInnerR = read_value;
} else if ( input_string.Contains("MUBarrelInnerR" )) {
m_MUBarrelInnerR = read_value;
} else if ( input_string.Contains("EMBarrelOuterR" )) {
m_EMBarrelOuterR = read_value;
} else if ( input_string.Contains("HADBarrelOuterR" )) {
m_HADBarrelOuterR = read_value;
} else if ( input_string.Contains("MUBarrelOuterR" )) {
m_MUBarrelOuterR = read_value;
} else if ( input_string.Contains("EMBarrelOuterZ" )) {
m_EMBarrelOuterZ = read_value;
} else if ( input_string.Contains("HADBarrelOuterZ" )) {
m_HADBarrelOuterZ = read_value;
} else if ( input_string.Contains("MUBarrelOuterZ" )) {
m_MUBarrelOuterZ = read_value;
} else if ( input_string.Contains("EMBarrelLayer" )) {
m_EMBarrelLayer = (Int_t) read_value;
} else if ( input_string.Contains("HADBarrelLayer" )) {
m_HADBarrelLayer = (Int_t) read_value;
} else if ( input_string.Contains("MUBarrelLayer" )) {
m_MUBarrelLayer = (Int_t) read_value;
} else if ( input_string.Contains("EMBarrelThick" )) {
m_EMBarrelThick = read_value;
} else if ( input_string.Contains("HADBarrelThick" )) {
m_HADBarrelThick = read_value;
} else if ( input_string.Contains("MUBarrelThick" )) {
m_MUBarrelThick = read_value;
} else if ( input_string.Contains("EMBarrelAbsThick" )) {
m_EMBarrelAbsThick = read_value;
} else if ( input_string.Contains("HADBarrelAbsThick" )) {
m_HADBarrelAbsThick = read_value;
} else if ( input_string.Contains("MUBarrelAbsThick" )) {
m_MUBarrelAbsThick = read_value;
} else if ( input_string.Contains("EMEndcapInnerZ" )) {
m_EMEndcapInnerZ = read_value;
} else if ( input_string.Contains("HADEndcapInnerZ" )) {
m_HADEndcapInnerZ = read_value;
} else if ( input_string.Contains("MUEndcapInnerZ" )) {
m_MUEndcapInnerZ = read_value;
} else if ( input_string.Contains("LUMEndcapInnerZ" )) {
m_LUMEndcapInnerZ = read_value;
} else if ( input_string.Contains("EMEndcapLayer" )) {
m_EMEndcapLayer = (Int_t) read_value;
} else if ( input_string.Contains("HADEndcapLayer" )) {
m_HADEndcapLayer = (Int_t) read_value;
} else if ( input_string.Contains("MUEndcapLayer" )) {
m_MUEndcapLayer = (Int_t) read_value;
} else if ( input_string.Contains("LUMEndcapLayer" )) {
m_LUMEndcapLayer = (Int_t) read_value;
} else if ( input_string.Contains("EMEndcapThick" )) {
m_EMEndcapThick = read_value;
} else if ( input_string.Contains("HADEndcapThick" )) {
m_HADEndcapThick = read_value;
} else if ( input_string.Contains("MUEndcapThick" )) {
m_MUEndcapThick = read_value;
} else if ( input_string.Contains("LUMEndcapThick" )) {
m_LUMEndcapThick = read_value;
}
}
}
}
if (input_line.Contains("Coil_Pipe:")) {
while( (inpos =fscanf(parFile,"%s",&name[0]) ) > 0){
input_string = name;
if ( input_string.Contains("end")) break;
inpos = fscanf(parFile,"%s %s",&equals[0],&temp[0]);
if ( input_string.Contains("CoilPlace" )) {
m_CoilPlace = temp;
}
read_value = strtod(temp,(Char_t**)NULL);
if ( input_string.Contains("CoilInnerR" )) {
m_CoilInnerR = read_value;
} else if ( input_string.Contains("CoilOuterZ" )) {
m_CoilOuterZ = read_value;
} else if ( input_string.Contains("CoilThick" )) {
m_CoilThick = read_value;
} else if ( input_string.Contains("CoilIntLeng" )) {
m_CoilIntLeng = read_value;
} else if ( input_string.Contains("PipeOuter" )) {
m_PipeOuter = read_value;
}
}
}
}
printf("Tracking Parameters Used: n n");
printf("PtMin= %f minHit= %i n",m_PtMin,m_minHit);
printf("PolarInner= %f n",m_PolarInner);
printf("PolarOuter= %f n", m_PolarOuter);
printf("Magnetic Field = %f n", m_Field);
printf("DetectorName= %s n", m_DetectorName.Data());
// rewind the file again
fseek(parFile, 0L, 0);
};
Int_t LCDGetParameters::SetDetectorVolumes(){
TString* coil_place = GetCoilPlace();
if (coil_place->CompareTo("CoilinHAD") == 0) {
printf("HAD cal is out of Coiln");
}else if (coil_place->CompareTo("CoiloutHAD") == 0) {
printf("HAD cal is inner of Coiln");
}else {
printf("Unsupported detectorn"); return 0;
}
static const Double_t FIELD = GetMagneticField();
static const Double_t EM_ENDCAP_INNER_Z = GetEMEndcapInnerZ();
static const Double_t HAD_ENDCAP_INNER_Z = GetHADEndcapInnerZ();
static const Double_t MUON_ENDCAP_INNER_Z = GetMUEndcapInnerZ();
static const Double_t EM_BARREL_INNER_R = GetEMBarrelInnerR();
static const Double_t HAD_BARREL_INNER_R = GetHADBarrelInnerR();
static const Double_t MUON_BARREL_INNER_R = GetMUBarrelInnerR();
static const Double_t THICK_EM =
(GetEMBarrelThick()) *(GetEMBarrelLayer());
static const Double_t THICK_HAD =
(GetHADBarrelThick())*(GetHADBarrelLayer());
static const Double_t THICK_MUON =
(GetMUBarrelThick()) *(GetMUBarrelLayer());
static const Double_t COIL_INNER_R = GetCoilInnerR();
static const Double_t THICK_COIL = GetCoilThick();
Double_t Lrad=0.0;
TString* EMmaterial = GetEMBarrelAbsMat();
if (EMmaterial->CompareTo("W") == 0) { Lrad = 0.35; }
else if (EMmaterial->CompareTo("Pb") == 0) { Lrad = 0.56; }
Double_t EM_radlength =
(GetEMBarrelAbsThick()) *(GetEMBarrelLayer())/Lrad;
static const Double_t RADLENPERCM_EM = EM_radlength / THICK_EM;
Double_t Lint=0.0;
if (EMmaterial->CompareTo("W") == 0) { Lint = 9.6; }
else if (EMmaterial->CompareTo("Pb") == 0) { Lint = 17.0; }
Double_t EM_intlength =
(GetEMBarrelAbsThick()) *(GetEMBarrelLayer())/Lint;
static const Double_t ILENPERCM_EM = EM_intlength / THICK_EM;
TString* HADmaterial = GetHADBarrelAbsMat();
if (HADmaterial->CompareTo("Cu") == 0) { Lint = 14.8; }
else if (HADmaterial->CompareTo("Pb") == 0) { Lint = 17.0; }
Double_t HAD_intlength =
(GetHADBarrelAbsThick()) *(GetHADBarrelLayer())/Lint;
static const Double_t ILENPERCM_HAD = HAD_intlength / THICK_HAD;
static const Double_t ILENPERCM_COIL =(GetCoilIntLeng())/ THICK_COIL;
static const Double_t ILENPERCM_MUON = 6.0 / THICK_MUON; // Large
//static const Double_t ILENPERCM_MUON = 7.1 / THICK_MUON; // Small
static const Double_t OUTER_PIPE = GetPipeOuter();
Int_t emBrlIx;
Int_t coilIx=0;
Int_t hadBrlIx;
Int_t emEcIx;
// Int_t hadEc1Ix;
Int_t N_BARREL=0, N_ENDCAP=0;
if (coil_place->CompareTo("CoilinHAD") == 0) {
N_BARREL = 7; // includes muon
N_ENDCAP = 6; // no muon yet
// nBarrel = 7; // air, EM, air, coil, had, air, muon.
// nEndcap = 6; // air, EM at innermost Z,
// air at next Z
// air, had-1, had-2 at outermost Z
// leaving out muon endcap for now
}else if (coil_place->CompareTo("CoiloutHAD") == 0) {
N_BARREL = 6;
N_ENDCAP = 5;
}
m_nVolumes = N_BARREL + N_ENDCAP;
LCDDetectorVolume* pCur;
pCur = m_Volumes = new LCDDetectorVolume [m_nVolumes];
Double_t Router[7]; Double_t Zouter[7];
Router[0] = EM_BARREL_INNER_R;
Router[1] = Router[0] + THICK_EM;
Zouter[0] = EM_ENDCAP_INNER_Z;
if (N_BARREL == 7) {
Router[2] = COIL_INNER_R;
Router[3] = Router[2] + THICK_COIL;
Router[4] = Router[3] + THICK_HAD;
Router[5] = MUON_BARREL_INNER_R;
Router[6] = Router[5] + THICK_MUON;
Zouter[1] = Zouter[2] = Zouter[3] = HAD_ENDCAP_INNER_Z;
Zouter[4] = Zouter[5] = Zouter[6] = MUON_ENDCAP_INNER_Z;
}else if (N_BARREL == 6) {
Router[2] = HAD_BARREL_INNER_R;
Router[3] = Router[2] + THICK_HAD;
Router[4] = MUON_BARREL_INNER_R;
Router[5] = Router[4] + THICK_MUON;
Zouter[1] = Zouter[2] = HAD_ENDCAP_INNER_Z;
Zouter[3] = Zouter[4] = Zouter[5] = MUON_ENDCAP_INNER_Z;
}
int i=0;
for (i = 0; i < m_nVolumes; i++) {
pCur->barrel = (i < N_BARREL);
pCur->iLenPerCm = 0.0; pCur->radLenPerCm = 0.0; pCur->pNextZ = 0;
if (i < N_BARREL ){
pCur->outerR = Router[i]; pCur->outerZ = Zouter[i];
pCur->innerZ = 0.0;
if (i == 0){
pCur->innerR = 0;
pCur->pPrevR = 0;
}else {
pCur->innerR = (pCur - 1)->outerR;
pCur->pPrevR = pCur - 1;
}
}
pCur++;
}
pCur = m_Volumes;
for (i = 0; i < N_BARREL-1; i++) {
pCur->pNextR = pCur + 1;
pCur++;
}
pCur->pNextR = 0;
// Tracker volume
pCur = m_Volumes;
Int_t iVol = 0;
pCur->volKind = VOL_AIR;
pCur->pNextZ = m_Volumes + N_BARREL; //adjacent air volume inside EM endcap
m_InnerVolume = pCur;
// EM cal
pCur++; iVol++;
emBrlIx = iVol;
pCur->volKind = VOL_EM;
pCur->iLenPerCm = ILENPERCM_EM;
pCur->radLenPerCm = RADLENPERCM_EM;
if (coil_place->CompareTo("CoilinHAD") == 0) {
pCur->pNextZ = m_Volumes + N_BARREL + 4; // adjacent to first Had ec vol.
}else if (coil_place->CompareTo("CoiloutHAD") == 0) {
pCur->pNextZ = m_Volumes + N_BARREL + 2; // next to air following EC endcap
}
// Air
pCur++; iVol++;
pCur->volKind = VOL_AIR;
if (coil_place->CompareTo("CoilinHAD") == 0) {
pCur->pNextZ = m_Volumes + N_BARREL + 4;
}else if (coil_place->CompareTo("CoiloutHAD") == 0) {
pCur->pNextZ = (pCur - 1)->pNextZ; // same as adjacent EM section
}
if (coil_place->CompareTo("CoilinHAD") == 0) {
// Coil
pCur++; iVol++; coilIx = iVol;
pCur->volKind = VOL_COIL;
pCur->iLenPerCm = ILENPERCM_COIL;
pCur->pNextZ = m_Volumes + N_BARREL + 5; // adjacent to 2nd had ec vol.
//HAD Cal
pCur++; iVol++; hadBrlIx = iVol;
pCur->volKind = VOL_HAD;
pCur->iLenPerCm = ILENPERCM_HAD;
pCur->pPrevR = pCur + coilIx;
//Air
pCur++; iVol++;
pCur->volKind = VOL_AIR;
// MU Cal
pCur++; iVol++;
pCur->volKind = VOL_MUON;
pCur->iLenPerCm = ILENPERCM_MUON;
//Now do something similar for endcaps
pCur++; iVol++; // next to beam pipe, at Z of EM endcap
pCur->volKind = VOL_AIR;
pCur->innerR = 0.0;
pCur->outerR = OUTER_PIPE;
pCur->innerZ = EM_ENDCAP_INNER_Z;
pCur->outerZ = pCur->innerZ + THICK_EM;
pCur->pPrevR = 0;
pCur->pNextR = pCur + 1;
pCur->pNextZ = pCur + 2;
// EM endcap
pCur++; iVol++; emEcIx = iVol;
pCur->volKind = VOL_EM;
pCur->innerR = OUTER_PIPE;
pCur->outerR = EM_BARREL_INNER_R;
pCur->innerZ = EM_ENDCAP_INNER_Z;
pCur->outerZ = pCur->innerZ + THICK_EM;
pCur->iLenPerCm = ILENPERCM_EM;
pCur->radLenPerCm = RADLENPERCM_EM;
pCur->pNextR = m_Volumes + emBrlIx;
pCur->pPrevR = pCur - 1; // air by beampipe
pCur->pNextZ = pCur + 1; // air between EM and had endcaps
// just outside of EM endcap in z
pCur++; iVol++;
pCur->volKind = VOL_AIR;
pCur->innerR = 0.0;
pCur->outerR = (pCur - 1)->outerR;
pCur->innerZ = (pCur - 1)->outerZ;
pCur->outerZ = HAD_ENDCAP_INNER_Z;
pCur->pNextR = m_Volumes + emBrlIx;
pCur->pPrevR = 0;
pCur->pNextZ = pCur + 1; // adjacent to another air volume
// next to beam pipe, at Z of had endcap
pCur++; iVol++;
pCur->volKind = VOL_AIR;
pCur->innerR = 0.0;
pCur->outerR = OUTER_PIPE;
pCur->innerZ = HAD_ENDCAP_INNER_Z;
pCur->outerZ = pCur->innerZ + THICK_HAD;
pCur->pPrevR = 0;
pCur->pNextR = pCur + 1;
// First EC had
pCur++; iVol++;
pCur->volKind = VOL_HAD;
pCur->innerR = OUTER_PIPE;
pCur->outerR = COIL_INNER_R;
pCur->innerZ = HAD_ENDCAP_INNER_Z;
pCur->outerZ = pCur->innerZ + THICK_HAD;
pCur->iLenPerCm = ILENPERCM_HAD;
pCur->pNextR = pCur + 1;
pCur->pPrevR = pCur - 1;
// Outer EC had
pCur++; iVol++;
pCur->volKind = VOL_HAD;
pCur->innerR = (pCur - 1)->outerR;
pCur->outerR = HAD_BARREL_INNER_R;
pCur->innerZ = HAD_ENDCAP_INNER_Z;
pCur->outerZ = pCur->innerZ + THICK_HAD;
pCur->iLenPerCm = ILENPERCM_HAD;
pCur->pNextR = m_Volumes + hadBrlIx;
pCur->pPrevR = pCur - 1;
}else if (coil_place->CompareTo("CoiloutHAD") == 0) {
pCur++; iVol++; hadBrlIx = iVol; // had
pCur->volKind = VOL_HAD;
pCur->iLenPerCm = ILENPERCM_HAD;
pCur++; iVol++;
pCur->volKind = VOL_COIL;
pCur->iLenPerCm = ILENPERCM_COIL;
pCur++; iVol++;
coilIx = iVol;
pCur->volKind = VOL_MUON;
pCur->iLenPerCm = ILENPERCM_MUON;
//Now do something similar for endcaps
pCur++; iVol++; // next to beam pipe, at Z of EM endcap
pCur->volKind = VOL_AIR;
pCur->innerR = 0.0;
pCur->outerR = OUTER_PIPE;
pCur->innerZ = EM_ENDCAP_INNER_Z;
pCur->outerZ = pCur->innerZ + THICK_EM;
pCur->pPrevR = 0;
pCur->pNextR = pCur + 1;
pCur->pNextZ = pCur + 2;
pCur++; iVol++; emEcIx = iVol; // EM endcap
pCur->volKind = VOL_EM;
pCur->innerR = OUTER_PIPE;
pCur->outerR = EM_BARREL_INNER_R;
pCur->innerZ = EM_ENDCAP_INNER_Z;
pCur->outerZ = pCur->innerZ + THICK_EM;
pCur->iLenPerCm = ILENPERCM_EM;
pCur->radLenPerCm = RADLENPERCM_EM;
pCur->pNextR = m_Volumes + emBrlIx;
pCur->pPrevR = pCur - 1; // air by beampipe
pCur->pNextZ = pCur + 1; // air between EM and had endcaps
pCur++; iVol++; // just outside of EM endcap in z
pCur->volKind = VOL_AIR;
pCur->innerR = 0.0;
pCur->outerR = EM_BARREL_INNER_R;
pCur->innerZ = (pCur - 1)->outerZ;
pCur->outerZ = HAD_ENDCAP_INNER_Z; // goes to beginning of ec had
pCur->pNextR = m_Volumes + emBrlIx;
pCur->pPrevR = 0;
pCur->pNextZ = pCur + 1; // adjacent to air, had ec vol.
pCur++; iVol++; // next to beam pipe, at Z of had endcap
pCur->volKind = VOL_AIR;
pCur->innerR = 0.0;
pCur->outerR = OUTER_PIPE;
pCur->innerZ = HAD_ENDCAP_INNER_Z;
pCur->outerZ = pCur->innerZ + THICK_HAD;
pCur->pPrevR = 0;
pCur->pNextR = pCur + 1;
// EC had
pCur++; iVol++;
pCur->volKind = VOL_HAD;
pCur->innerR = OUTER_PIPE;
pCur->outerR = HAD_BARREL_INNER_R;
pCur->innerZ = HAD_ENDCAP_INNER_Z;
pCur->outerZ = pCur->innerZ + THICK_HAD;
pCur->iLenPerCm = ILENPERCM_HAD;
pCur->pNextR = m_Volumes + hadBrlIx;
pCur->pPrevR = pCur - 1;
}
// Fill in field based on radius
pCur = m_Volumes;
for (int j = 0; j < m_nVolumes; j++) {
if (pCur->outerR <= (m_Volumes + coilIx)->innerR) {
pCur->field = FIELD;
} else if (pCur->innerR >= (m_Volumes + coilIx)->outerR) {
pCur->field = -0.1 * FIELD;
} else {
pCur->field = FIELD * .45; // average field in coil
}
pCur++;
}
// Take care of field stuff here while we're at it.
// fieldInner = 6.0;
// fieldOuter = -0.1 * (fieldInner);
// fieldInnerR = pCur->innerR;
// fieldOuterR = pCur->outerR`;
return 1;
}
ROOT page - Class index - Top of the page
This page has been automatically generated. If you have any comments or suggestions about the page layout send a mail to ROOT support, or contact the developers with any questions or problems regarding ROOT.