Simulation of ArCO2 mixture
authorcblume <cblume@f7af4fe6-9843-0410-8265-dc069ae4e863>
Thu, 3 Jul 2008 15:42:20 +0000 (15:42 +0000)
committercblume <cblume@f7af4fe6-9843-0410-8265-dc069ae4e863>
Thu, 3 Jul 2008 15:42:20 +0000 (15:42 +0000)
TRD/AliTRD.cxx
TRD/AliTRD.h
TRD/AliTRDSimParam.cxx
TRD/AliTRDSimParam.h
TRD/AliTRDfeeParam.cxx
TRD/AliTRDfeeParam.h
TRD/AliTRDsimTR.cxx
TRD/AliTRDsimTR.h
TRD/AliTRDv1.cxx
TRD/AliTRDv1.h

index 8972856..8175357 100644 (file)
@@ -68,6 +68,7 @@ AliTRD::AliTRD()
   ,fGeometry(0)
   ,fGasDensity(0)
   ,fFoilDensity(0)
+  ,fGasNobleFraction(0)
   ,fDrawTR(0)
   ,fDisplayType(0)
 {
@@ -459,7 +460,7 @@ void AliTRD::CreateMaterials()
   Float_t aco[2]    = { 12.011 , 15.9994 };
   Float_t zco[2]    = {  6.0   ,  8.0    };
   Float_t wco[2]    = {  1.0   ,  2.0    };
-  Float_t dco       = 0.00186;
+  Float_t dco       = 0.00186; // at 20C
 
   // For water
   Float_t awa[2]    = {  1.0079, 15.9994 };
@@ -467,12 +468,6 @@ void AliTRD::CreateMaterials()
   Float_t wwa[2]    = {  2.0   ,  1.0    };
   Float_t dwa       = 1.0;
 
-  // For isobutane (C4H10)
-  Float_t ais[2]    = { 12.011 ,  1.0079 };
-  Float_t zis[2]    = {  6.0   ,  1.0    };
-  Float_t wis[2]    = {  4.0   , 10.0    };
-  Float_t dis       = 0.00267;
-
   // For plexiglas (C5H8O2)
   Float_t apg[3]    = { 12.011 ,  1.0079, 15.9994 };
   Float_t zpg[3]    = {  6.0   ,  1.0   ,  8.0    };
@@ -509,8 +504,17 @@ void AliTRD::CreateMaterials()
   Float_t wXeCO2[3] = {   8.5    ,   1.5    ,   3.0     }; 
   // Xe-content of the Xe/CO2-mixture (85% / 15%) 
   Float_t fxc       = 0.85;
-  Float_t dxe       = 0.00549;
-  Float_t dgm       = fxc * dxe + (1.0 - fxc) * dco;
+  Float_t dxe       = 0.00549; // at 20C
+  Float_t dgmXe     = fxc * dxe + (1.0 - fxc) * dco;
+
+  // For Ar/CO2-gas-mixture
+  Float_t aArCO2[3] = {  39.948  ,  12.0107 ,  15.9994  };
+  Float_t zArCO2[3] = {  18.0    ,   6.0    ,   8.0     };
+  Float_t wArCO2[3] = {   8.2    ,   1.8    ,   3.6     }; 
+  // Ar-content of the Ar/CO2-mixture (82% / 18%) 
+  Float_t fac       = 0.82;
+  Float_t dar       = 0.00166; // at 20C
+  Float_t dgmAr     = fac * dar + (1.0 - fac) * dco;
   
   // General tracking parameter
   Float_t tmaxfd    = -10.0;
@@ -535,8 +539,17 @@ void AliTRD::CreateMaterials()
   AliMixture(2, "Air"         , aAir,   zAir,   dAir,    4, wAir  );
   AliMixture(3, "Polyethilene", ape,    zpe,    dpe,    -2, wpe   );
   AliMixture(8, "CO2",          aco,    zco,    dco,    -2, wco   );
-  AliMixture(9, "Isobutane",    ais,    zis,    dis,    -2, wis   );
-  AliMixture(10,"Gas mixture",  aXeCO2, zXeCO2, dgm,    -3, wXeCO2);
+  if      (AliTRDSimParam::Instance()->IsXenon()) {
+    AliMixture(10,"XeCO2",        aXeCO2, zXeCO2, dgmXe,  -3, wXeCO2);
+  }
+  else if (AliTRDSimParam::Instance()->IsArgon()) {
+    AliInfo("Gas mixture: Ar C02 (80/20)");
+    AliMixture(10,"ArCO2",        aArCO2, zArCO2, dgmAr,  -3, wArCO2);
+  }
+  else {
+    AliFatal("Wrong gas mixture");
+    exit(1);
+  }
   AliMixture(12,"G10",          aG10,   zG10,   dG10,    4, wG10  );
   AliMixture(13,"Water",        awa,    zwa,    dwa,    -2, wwa   );
   AliMixture(14,"Plexiglas",    apg,    zpg,    dpg,    -3, wpg   );
@@ -623,7 +636,14 @@ void AliTRD::CreateMaterials()
   // Save the density values for the TRD absorbtion
   Float_t dmy  = 1.39;
   fFoilDensity = dmy;
-  fGasDensity  = dgm;
+  if      (AliTRDSimParam::Instance()->IsXenon()) {
+    fGasDensity       = dgmXe;
+    fGasNobleFraction = fxc;
+  }
+  else if (AliTRDSimParam::Instance()->IsArgon()) {
+    fGasDensity       = dgmAr;
+    fGasNobleFraction = fac;
+  }
 
 }
 
index 1d16e8a..94ec016 100644 (file)
@@ -84,6 +84,7 @@ class AliTRD : public AliDetector {
 
           Float_t  fGasDensity;         //  The density of the drift gas
           Float_t  fFoilDensity;        //  The density of the entrance window foil
+          Float_t  fGasNobleFraction;   //  The fraction of noble gas in the mixture
 
           Int_t    fDrawTR;             //  Switches marking the TR photons in the display
           Int_t    fDisplayType;        //  Display type (0: normal, 1: detailed) 
@@ -93,7 +94,7 @@ class AliTRD : public AliDetector {
   AliTRD(const AliTRD &trd);
   AliTRD  &operator=(const AliTRD &trd);
 
-  ClassDef(AliTRD,9)                    //  Transition Radiation Detector base class
+  ClassDef(AliTRD,10)                   //  Transition Radiation Detector base class
 
 };
 
index d6f0c35..feab8e5 100644 (file)
@@ -99,6 +99,7 @@ AliTRDSimParam::AliTRDSimParam()
   ,fTimeCoupling(0.0)
   ,fTimeStructOn(kFALSE)
   ,fPRFOn(kFALSE)
+  ,fGasMixture(0)
 {
   //
   // Default constructor
@@ -155,6 +156,9 @@ void AliTRDSimParam::Init()
   // The pad response function
   fPRFOn             = kTRUE;
 
+  // The gas mixture, default Xenon
+  fGasMixture        = kXenon;
+
   ReInit();
 
 }
@@ -203,6 +207,7 @@ AliTRDSimParam::AliTRDSimParam(const AliTRDSimParam &p)
   ,fTimeCoupling(p.fTimeCoupling)
   ,fTimeStructOn(p.fTimeStructOn)
   ,fPRFOn(p.fPRFOn)
+  ,fGasMixture(p.fGasMixture)
 {
   //
   // Copy constructor
@@ -274,6 +279,7 @@ void AliTRDSimParam::Copy(TObject &p) const
   target->fPadCoupling        = fPadCoupling;
   target->fTimeCoupling       = fTimeCoupling;
   target->fPRFOn              = fPRFOn;
+  target->fGasMixture         = fGasMixture;
 
   if (target->fTRFsmp) {
     delete[] target->fTRFsmp;
@@ -300,12 +306,26 @@ void AliTRDSimParam::ReInit()
   // Reinitializes the parameter class after a change
   //
 
-  // The range and the binwidth for the sampled TRF 
-  fTRFbin = 200;
-  // Start 0.2 mus before the signal
-  fTRFlo  = -0.4;
-  // End the maximum drift time after the signal 
-  fTRFhi  =  3.58;
+  if      (fGasMixture == kXenon) {
+    // The range and the binwidth for the sampled TRF 
+    fTRFbin = 200;
+    // Start 0.2 mus before the signal
+    fTRFlo  = -0.4;
+    // End the maximum drift time after the signal 
+    fTRFhi  =  3.58;
+  }
+  else if (fGasMixture == kArgon) {
+    // The range and the binwidth for the sampled TRF 
+    fTRFbin =  50;
+    // Start 0.2 mus before the signal
+    fTRFlo  =  0.02;
+    // End the maximum drift time after the signal 
+    fTRFhi  =  1.98;
+  }
+  else {
+    AliFatal("Not a valid gas mixture!");
+    exit(1);
+  }
   fTRFwid = (fTRFhi - fTRFlo) / ((Float_t) fTRFbin);
 
   // Create the sampled TRF
@@ -318,76 +338,84 @@ void AliTRDSimParam::SampleTRF()
 {
   //
   // Samples the new time response function.
-  // From Antons measurements with Fe55 source, adjusted by C. Lippmann.
-  // time bins are -0.4, -0.38, -0.36, ...., 3.54, 3.56, 3.58 microseconds
   //
 
-  const Int_t kNpasa     = 200;  // kNpasa should be equal to fTRFbin!
-
-  Float_t signal[kNpasa]={ 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000
-                        , 0.0002, 0.0007, 0.0026, 0.0089, 0.0253, 0.0612, 0.1319
-                        , 0.2416, 0.3913, 0.5609, 0.7295, 0.8662, 0.9581, 1.0000
-                        , 0.9990, 0.9611, 0.8995, 0.8269, 0.7495, 0.6714, 0.5987
-                        , 0.5334, 0.4756, 0.4249, 0.3811, 0.3433, 0.3110, 0.2837
-                        , 0.2607, 0.2409, 0.2243, 0.2099, 0.1974, 0.1868, 0.1776
-                        , 0.1695, 0.1627, 0.1566, 0.1509, 0.1457, 0.1407, 0.1362
-                        , 0.1317, 0.1274, 0.1233, 0.1196, 0.1162, 0.1131, 0.1102
-                        , 0.1075, 0.1051, 0.1026, 0.1004, 0.0979, 0.0956, 0.0934
-                        , 0.0912, 0.0892, 0.0875, 0.0858, 0.0843, 0.0829, 0.0815
-                        , 0.0799, 0.0786, 0.0772, 0.0757, 0.0741, 0.0729, 0.0718
-                        , 0.0706, 0.0692, 0.0680, 0.0669, 0.0655, 0.0643, 0.0630
-                        , 0.0618, 0.0607, 0.0596, 0.0587, 0.0576, 0.0568, 0.0558
-                        , 0.0550, 0.0541, 0.0531, 0.0522, 0.0513, 0.0505, 0.0497
-                        , 0.0490, 0.0484, 0.0474, 0.0465, 0.0457, 0.0449, 0.0441
-                        , 0.0433, 0.0425, 0.0417, 0.0410, 0.0402, 0.0395, 0.0388
-                        , 0.0381, 0.0374, 0.0368, 0.0361, 0.0354, 0.0348, 0.0342
-                        , 0.0336, 0.0330, 0.0324, 0.0318, 0.0312, 0.0306, 0.0301
-                        , 0.0296, 0.0290, 0.0285, 0.0280, 0.0275, 0.0270, 0.0265
-                        , 0.0260, 0.0256, 0.0251, 0.0246, 0.0242, 0.0238, 0.0233
-                        , 0.0229, 0.0225, 0.0221, 0.0217, 0.0213, 0.0209, 0.0206
-                        , 0.0202, 0.0198, 0.0195, 0.0191, 0.0188, 0.0184, 0.0181
-                        , 0.0178, 0.0175, 0.0171, 0.0168, 0.0165, 0.0162, 0.0159
-                        , 0.0157, 0.0154, 0.0151, 0.0148, 0.0146, 0.0143, 0.0140
-                        , 0.0138, 0.0135, 0.0133, 0.0131, 0.0128, 0.0126, 0.0124
-                        , 0.0121, 0.0119, 0.0120, 0.0115, 0.0113, 0.0111, 0.0109
-                        , 0.0107, 0.0105, 0.0103, 0.0101, 0.0100, 0.0098, 0.0096
-                        , 0.0094, 0.0092, 0.0091, 0.0089, 0.0088, 0.0086, 0.0084
-                        , 0.0083, 0.0081, 0.0080, 0.0078 };
-
-//     // Andronic & Bercuci parametrization
-//     // define new TRF parametrization
-//             // normalizing constant to Fe signal
-//     const Float_t k1=1.055;
-//     // time constants
-//     const Float_t t1=0.04;
-//     const Float_t t2=.9;
-//     // the relative fraction of the long component
-//     const Float_t k2=.15;
-//     // time offset for Fe
-//     const Float_t t0=-.29;
-//     Float_t x = t0; Int_t index;
-//     for(int i=0; i<kNpasa; i++) signal[i] = 0.;
-//   for(int i=0; i<kNpasa; i++){
-//             index = i+6;
-//             if(index >= kNpasa) break;
-//             x += .02;
-//             signal[index]=k1*(TMath::Power((x-t0)/t1, 2.5)*(exp(-(x-t0)/t1))+k2*exp(-(x-t0)/t2));
-//     }
-
-       Float_t xtalk[kNpasa];
+  Int_t ipasa = 0;
 
+  // Xenon
+  // From Antons measurements with Fe55 source, adjusted by C. Lippmann.
+  // time bins are -0.4, -0.38, -0.36, ...., 3.54, 3.56, 3.58 microseconds
+  const Int_t kNpasa     = 200;  // kNpasa should be equal to fTRFbin!
+  Float_t xtalk[kNpasa];
+  Float_t signal[kNpasa]     = { 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000
+                              , 0.0002, 0.0007, 0.0026, 0.0089, 0.0253, 0.0612, 0.1319
+                              , 0.2416, 0.3913, 0.5609, 0.7295, 0.8662, 0.9581, 1.0000
+                              , 0.9990, 0.9611, 0.8995, 0.8269, 0.7495, 0.6714, 0.5987
+                              , 0.5334, 0.4756, 0.4249, 0.3811, 0.3433, 0.3110, 0.2837
+                              , 0.2607, 0.2409, 0.2243, 0.2099, 0.1974, 0.1868, 0.1776
+                              , 0.1695, 0.1627, 0.1566, 0.1509, 0.1457, 0.1407, 0.1362
+                              , 0.1317, 0.1274, 0.1233, 0.1196, 0.1162, 0.1131, 0.1102
+                              , 0.1075, 0.1051, 0.1026, 0.1004, 0.0979, 0.0956, 0.0934
+                              , 0.0912, 0.0892, 0.0875, 0.0858, 0.0843, 0.0829, 0.0815
+                              , 0.0799, 0.0786, 0.0772, 0.0757, 0.0741, 0.0729, 0.0718
+                              , 0.0706, 0.0692, 0.0680, 0.0669, 0.0655, 0.0643, 0.0630
+                              , 0.0618, 0.0607, 0.0596, 0.0587, 0.0576, 0.0568, 0.0558
+                              , 0.0550, 0.0541, 0.0531, 0.0522, 0.0513, 0.0505, 0.0497
+                              , 0.0490, 0.0484, 0.0474, 0.0465, 0.0457, 0.0449, 0.0441
+                              , 0.0433, 0.0425, 0.0417, 0.0410, 0.0402, 0.0395, 0.0388
+                              , 0.0381, 0.0374, 0.0368, 0.0361, 0.0354, 0.0348, 0.0342
+                              , 0.0336, 0.0330, 0.0324, 0.0318, 0.0312, 0.0306, 0.0301
+                              , 0.0296, 0.0290, 0.0285, 0.0280, 0.0275, 0.0270, 0.0265
+                              , 0.0260, 0.0256, 0.0251, 0.0246, 0.0242, 0.0238, 0.0233
+                              , 0.0229, 0.0225, 0.0221, 0.0217, 0.0213, 0.0209, 0.0206
+                              , 0.0202, 0.0198, 0.0195, 0.0191, 0.0188, 0.0184, 0.0181
+                              , 0.0178, 0.0175, 0.0171, 0.0168, 0.0165, 0.0162, 0.0159
+                              , 0.0157, 0.0154, 0.0151, 0.0148, 0.0146, 0.0143, 0.0140
+                              , 0.0138, 0.0135, 0.0133, 0.0131, 0.0128, 0.0126, 0.0124
+                              , 0.0121, 0.0119, 0.0120, 0.0115, 0.0113, 0.0111, 0.0109
+                              , 0.0107, 0.0105, 0.0103, 0.0101, 0.0100, 0.0098, 0.0096
+                              , 0.0094, 0.0092, 0.0091, 0.0089, 0.0088, 0.0086, 0.0084
+                              , 0.0083, 0.0081, 0.0080, 0.0078 };
+  signal[0] = 0.0;
+  signal[1] = 0.0;
+  signal[2] = 0.0;
   // With undershoot, positive peak corresponds to ~3% of the main signal:
-  for (Int_t ipasa = 3; ipasa < kNpasa; ipasa++) {
+  for (ipasa = 3; ipasa < kNpasa; ipasa++) {
     xtalk[ipasa] = 0.2 * (signal[ipasa-2] - signal[ipasa-3]);
   }
-
   xtalk[0]  = 0.0;   
   xtalk[1]  = 0.0;  
   xtalk[2]  = 0.0;  
 
-  signal[0] = 0.0;
-  signal[1] = 0.0;
-  signal[2] = 0.0;
+  // Argon
+  // Ar measurement with Fe55 source by Anton
+  // time bins are 0.02, 0.06, 0.10, ...., 1.90, 1.94, 1.98 microseconds
+  const Int_t kNpasaAr = 50;
+  Float_t xtalkAr[kNpasaAr];
+  Float_t signalAr[kNpasaAr] = { -0.01,  0.01,  0.00,  0.00,  0.01
+                               , -0.01,  0.01,  2.15, 22.28, 55.53
+                               , 68.52, 58.21, 40.92, 27.12, 18.49
+                               , 13.42, 10.48,  8.67,  7.49,  6.55
+                               ,  5.71,  5.12,  4.63,  4.22,  3.81
+                               ,  3.48,  3.20,  2.94,  2.77,  2.63
+                               ,  2.50,  2.37,  2.23,  2.13,  2.03
+                               ,  1.91,  1.83,  1.75,  1.68,  1.63
+                               ,  1.56,  1.49,  1.50,  1.49,  1.29
+                              ,  1.19,  1.21,  1.21,  1.20,  1.10 };
+  // Normalization to maximum
+  for (ipasa = 0; ipasa < kNpasa; ipasa++) {
+    signalAr[ipasa] /= 68.52;
+  }
+  signalAr[0] = 0.0;
+  signalAr[1] = 0.0;
+  signalAr[2] = 0.0;
+  // With undershoot, positive peak corresponds to ~3% of the main signal:
+  for (ipasa = 3; ipasa < kNpasa; ipasa++) {
+    xtalkAr[ipasa] = 0.2 * (signalAr[ipasa-2] - signalAr[ipasa-3]);
+  }
+  xtalkAr[0]  = 0.0;   
+  xtalkAr[1]  = 0.0;  
+  xtalkAr[2]  = 0.0;  
 
   if (fTRFsmp) {
     delete [] fTRFsmp;
@@ -400,8 +428,14 @@ void AliTRDSimParam::SampleTRF()
   fCTsmp  = new Float_t[fTRFbin];
 
   for (Int_t iBin = 0; iBin < fTRFbin; iBin++) {
-    fTRFsmp[iBin] = signal[iBin];
-    fCTsmp[iBin]  = xtalk[iBin];
+    if (fGasMixture == kXenon) {
+      fTRFsmp[iBin] = signal[iBin];
+      fCTsmp[iBin]  = xtalk[iBin];
+    }
+    else {
+      fTRFsmp[iBin] = signalAr[iBin];
+      fCTsmp[iBin]  = xtalkAr[iBin];
+    }
   }
 
 }
index 74efc34..504016d 100644 (file)
@@ -22,6 +22,9 @@ class AliTRDSimParam : public TObject {
                , kNsect =  18
                , kNdet  = 540 };
 
+          enum { kXenon =   0
+              , kArgon =   1 };
+
   static  AliTRDSimParam *Instance();
   static  void     Terminate();
   
@@ -30,49 +33,55 @@ class AliTRDSimParam : public TObject {
 
   virtual void     Copy(TObject &p) const;
   
-          void     SetGasGain(Float_t gasgain)               { fGasGain           = gasgain;         }
-          void     SetNoise(Float_t noise)                   { fNoise             = noise;           }
-          void     SetChipGain(Float_t chipgain)             { fChipGain          = chipgain;        }
-          void     SetADCoutRange(Float_t range)             { fADCoutRange       = range;           }
-          void     SetADCinRange(Float_t range)              { fADCinRange        = range;           }
-//        void     SetADCthreshold(Int_t thresh)             { fADCthreshold      = thresh;          }
-          void     SetADCbaseline(Int_t basel)               { fADCbaseline       = basel;           }   
-          void     SetDiffusion(Int_t diffOn = 1)            { fDiffusionOn       = diffOn;          }
-          void     SetElAttach(Int_t elOn = 1)               { fElAttachOn        = elOn;            }
-          void     SetElAttachProp(Float_t prop)             { fElAttachProp      = prop;            }
-          void     SetTimeResponse(Int_t trfOn = 1)          { fTRFOn             = trfOn; ReInit(); }  
-          void     SetCrossTalk(Int_t ctOn = 1)              { fCTOn              = ctOn; ReInit();  }
-          void     SetPadCoupling(Float_t v)                 { fPadCoupling       = v;               }
-          void     SetTimeCoupling(Float_t v)                { fTimeCoupling      = v;               }
-          void     SetAnodeWireOffset(Float_t offset = 0.25) { fAnodeWireOffset   = offset;          }
-          void     SetTimeStruct(Bool_t tsOn = 1)            { fTimeStructOn      = tsOn;            }
-          void     SetPadResponse(Int_t prfOn = 1)           { fPRFOn             = prfOn;           }
+          void     SetGasGain(Float_t gasgain)               { fGasGain           = gasgain;          }
+          void     SetNoise(Float_t noise)                   { fNoise             = noise;            }
+          void     SetChipGain(Float_t chipgain)             { fChipGain          = chipgain;         }
+          void     SetADCoutRange(Float_t range)             { fADCoutRange       = range;            }
+          void     SetADCinRange(Float_t range)              { fADCinRange        = range;            }
+          void     SetADCbaseline(Int_t basel)               { fADCbaseline       = basel;            }   
+          void     SetDiffusion(Int_t diffOn = 1)            { fDiffusionOn       = diffOn;           }
+          void     SetElAttach(Int_t elOn = 1)               { fElAttachOn        = elOn;             }
+          void     SetElAttachProp(Float_t prop)             { fElAttachProp      = prop;             }
+          void     SetTimeResponse(Int_t trfOn = 1)          { fTRFOn             = trfOn; ReInit();  }  
+          void     SetCrossTalk(Int_t ctOn = 1)              { fCTOn              = ctOn; ReInit();   }
+          void     SetPadCoupling(Float_t v)                 { fPadCoupling       = v;                }
+          void     SetTimeCoupling(Float_t v)                { fTimeCoupling      = v;                }
+          void     SetAnodeWireOffset(Float_t offset = 0.25) { fAnodeWireOffset   = offset;           }
+          void     SetTimeStruct(Bool_t tsOn = 1)            { fTimeStructOn      = tsOn;             }
+          void     SetPadResponse(Int_t prfOn = 1)           { fPRFOn             = prfOn;            }
+          void     SetXenon()                                { fGasMixture        = kXenon; ReInit(); }
+          void     SetArgon()                                { fGasMixture        = kArgon; ReInit(); }
     
-          Float_t  GetGasGain() const                        { return fGasGain;                      }
-          Float_t  GetNoise() const                          { return fNoise;                        }
-          Float_t  GetChipGain() const                       { return fChipGain;                     }
-          Float_t  GetADCoutRange() const                    { return fADCoutRange;                  }
-          Float_t  GetADCinRange() const                     { return fADCinRange;                   }
-//        Int_t    GetADCthreshold() const                   { return fADCthreshold;                 }
-          Int_t    GetADCbaseline() const                    { return fADCbaseline;                  }
-          Float_t  GetTRFlo() const                          { return fTRFlo;                        }
-          Float_t  GetTRFhi() const                          { return fTRFhi;                        }
-          Float_t  GetPadCoupling() const                    { return fPadCoupling;                  }
-          Float_t  GetTimeCoupling() const                   { return fTimeCoupling;                 }
-          Float_t  GetAnodeWireOffset() const                { return fAnodeWireOffset;              }
-
-          Bool_t   DiffusionOn() const                       { return fDiffusionOn;                  }
-          Bool_t   ElAttachOn() const                        { return fElAttachOn;                   } 
-          Float_t  GetElAttachProp() const                   { return fElAttachProp;                 }
-          Bool_t   TRFOn() const                             { return fTRFOn;                        }
-          Bool_t   CTOn() const                              { return fCTOn;                         }
-          Bool_t   TimeStructOn() const                      { return fTimeStructOn;                 }
-          Bool_t   PRFOn() const                             { return fPRFOn;                        }
+          Float_t  GetGasGain() const                        { return fGasGain;                       }
+          Float_t  GetNoise() const                          { return fNoise;                         }
+          Float_t  GetChipGain() const                       { return fChipGain;                      }
+          Float_t  GetADCoutRange() const                    { return fADCoutRange;                   }
+          Float_t  GetADCinRange() const                     { return fADCinRange;                    }
+          Int_t    GetADCbaseline() const                    { return fADCbaseline;                   }
+          Float_t  GetTRFlo() const                          { return fTRFlo;                         }
+          Float_t  GetTRFhi() const                          { return fTRFhi;                         }
+          Float_t  GetPadCoupling() const                    { return fPadCoupling;                   }
+          Float_t  GetTimeCoupling() const                   { return fTimeCoupling;                  }
+          Float_t  GetAnodeWireOffset() const                { return fAnodeWireOffset;               }
+          Int_t    GetGasMixture() const                     { return fGasMixture;                    }
+
+          Bool_t   DiffusionOn() const                       { return fDiffusionOn;                   }
+          Bool_t   ElAttachOn() const                        { return fElAttachOn;                    } 
+          Float_t  GetElAttachProp() const                   { return fElAttachProp;                  }
+          Bool_t   TRFOn() const                             { return fTRFOn;                         }
+          Bool_t   CTOn() const                              { return fCTOn;                          }
+          Bool_t   TimeStructOn() const                      { return fTimeStructOn;                  }
+          Bool_t   PRFOn() const                             { return fPRFOn;                         }
 
           Double_t TimeResponse(Double_t time) const;  
           Double_t CrossTalk(Double_t time) const; 
   
-protected:
+          Bool_t   IsXenon() const                           { return (fGasMixture == kXenon) 
+                                                                    ? kTRUE : kFALSE;                 }
+          Bool_t   IsArgon() const                           { return (fGasMixture == kArgon) 
+                                                                    ? kTRUE : kFALSE;                 }
+
+ protected:
 
   static AliTRDSimParam* fgInstance;   //  Instance of this class (singleton implementation)
   static  Bool_t   fgTerminated;       //  Defines if this class has already been terminated and
@@ -85,7 +94,6 @@ protected:
   
           Float_t  fADCoutRange;       //  ADC output range (number of channels)
           Float_t  fADCinRange;        //  ADC input range (input charge)
-          // Int_t    fADCthreshold;   //  ADC threshold in ADC channel ... Obsolete
           Int_t    fADCbaseline;       //  ADC intrinsic baseline in ADC channel
   
           Int_t    fDiffusionOn;       //  Switch for the diffusion
@@ -109,7 +117,9 @@ protected:
           Int_t    fTimeStructOn;      //  Switch for cell time structure
   
           Int_t    fPRFOn;             //  Switch for the pad response
-  
+
+          Int_t    fGasMixture;        //  Gas mixture: 0-Xe/C02 1-Ar/CO2. 
+
  private:
 
   // This is a singleton, constructor is private!  
@@ -120,7 +130,7 @@ protected:
           void ReInit();
           void SampleTRF();
   
-  ClassDef(AliTRDSimParam,1)          // The TRD simulation parameters
+  ClassDef(AliTRDSimParam,2)          // The TRD simulation parameters
 
 };
 
index 68776af..89ed26e 100644 (file)
@@ -84,6 +84,7 @@ void AliTRDfeeParam::Terminate()
 AliTRDfeeParam::AliTRDfeeParam()
   :TObject()
   ,fCP(0)
+  ,fTFnExp(1)
   ,fTFr1(0)
   ,fTFr2(0)
   ,fTFc1(0)
@@ -100,13 +101,13 @@ AliTRDfeeParam::AliTRDfeeParam()
   //
   
   // PASA V.4
-  if      (fgkTFnExp == 1) {
+  if      (fTFnExp == 1) {
     fTFr1 = 1.1563;
     fTFr2 = 0.1299;
     fTFc1 = 0.0657;
     fTFc2 = 0.0000;
   }
-  else if (fgkTFnExp == 2) {
+  else if (fTFnExp == 2) {
     fTFr1 = 1.1563;
     fTFr2 = 0.1299;
     fTFc1 = 0.1141;
@@ -121,6 +122,7 @@ AliTRDfeeParam::AliTRDfeeParam()
 AliTRDfeeParam::AliTRDfeeParam(TRootIoCtor *)
   :TObject()
   ,fCP(0)
+  ,fTFnExp(1)
   ,fTFr1(0)
   ,fTFr2(0)
   ,fTFc1(0)
@@ -142,6 +144,7 @@ AliTRDfeeParam::AliTRDfeeParam(TRootIoCtor *)
 AliTRDfeeParam::AliTRDfeeParam(const AliTRDfeeParam &p)
   :TObject(p)
   ,fCP(p.fCP)
+  ,fTFnExp(p.fTFnExp)
   ,fTFr1(p.fTFr1)
   ,fTFr2(p.fTFr2)
   ,fTFc1(p.fTFc1)
@@ -191,6 +194,7 @@ void AliTRDfeeParam::Copy(TObject &p) const
   //
 
   ((AliTRDfeeParam &) p).fCP          = fCP;
+  ((AliTRDfeeParam &) p).fTFnExp      = fTFnExp;
   ((AliTRDfeeParam &) p).fTFr1        = fTFr1;
   ((AliTRDfeeParam &) p).fTFr2        = fTFr2;
   ((AliTRDfeeParam &) p).fTFc1        = fTFc1;
@@ -394,3 +398,33 @@ void AliTRDfeeParam::SetRAWversion( Int_t rawver )
   }
 
 }
+
+//_____________________________________________________________________________
+void AliTRDfeeParam::SetXenon()
+{
+  //
+  // Sets the filter parameters for the Xenon gas mixture
+  //
+
+  fTFnExp = 1;
+  fTFr1   = 1.1563;
+  fTFr2   = 0.1299;
+  fTFc1   = 0.0657;
+  fTFc2   = 0.0000;
+
+}
+
+//_____________________________________________________________________________
+void AliTRDfeeParam::SetArgon()
+{
+  //
+  // Sets the filter parameters for the Argon gas mixture
+  //
+
+  fTFnExp = 2;
+  fTFr1   = 6.0;
+  fTFr2   = 0.62;
+  fTFc1   = 0.0087;
+  fTFc2   = 0.07;
+
+}
index 3fe55c6..dee2d9f 100644 (file)
@@ -90,7 +90,8 @@ class AliTRDfeeParam : public TObject
   //        Int_t    GetFilterType() const { return fFilterType; };
 
   static  Int_t    GetTFtype()            { return fgkTFtype;       }
-  static  Int_t    GetTFnExp()            { return fgkTFnExp;       }
+  //static  Int_t    GetTFnExp()            { return fgkTFnExp;       }
+          Int_t    GetTFnExp()            { return fTFnExp;         }
           Float_t  GetTFr1()        const { return fTFr1;           }
           Float_t  GetTFr2()        const { return fTFr2;           }
           Float_t  GetTFc1()        const { return fTFc1;           }
@@ -121,6 +122,9 @@ class AliTRDfeeParam : public TObject
           Bool_t   GetRAWstoreRaw() const                   { return fRAWstoreRaw;       }
           void     SetRAWstoreRaw( Bool_t storeraw )        { fRAWstoreRaw = storeraw;   }
 
+          void     SetXenon();
+          void     SetArgon();
+
  protected:
 
   static AliTRDfeeParam *fgInstance;         // Singleton instance
@@ -163,7 +167,8 @@ class AliTRDfeeParam : public TObject
   static const Int_t    fgkTFtype            = 1;         // TC type (0=analog, 1=digital, 2=MI, 3=close to electronics) (old name fFilterType)
 
   // OLD TF setup (calculated from above)  (valid only for fgkTFsimType = 0 or 1)
-  static const Int_t    fgkTFnExp          = 1;           // Number of exponential for simType 0 and 1
+  //static const Int_t    fgkTFnExp          = 1;           // Number of exponential for simType 0 and 1
+               Int_t    fTFnExp;                      // Number of exponential for simType 0 and 1
 
  // Tracklet  processing on/off 
   static const Bool_t   fgkTracklet         = kFALSE; // default should be kFALSE
@@ -217,7 +222,7 @@ class AliTRDfeeParam : public TObject
 
   AliTRDfeeParam();
 
-  ClassDef(AliTRDfeeParam,2)                              // The TRD front end electronics parameter
+  ClassDef(AliTRDfeeParam,3)                              // The TRD front end electronics parameter
 
 };
 #endif
index b940f7b..a1a4a7a 100644 (file)
@@ -445,7 +445,7 @@ Int_t AliTRDsimTR::TrPhotons(Float_t p, Float_t mass
     energykeV = fSpectrum->GetBinCenter(iBin);
     energyeV  = energykeV * 1.0e3;
 
-    sigma    = Sigma(energykeV);
+    sigma     = Sigma(energykeV);
 
     csi1      = fFoilOmega / energyeV;
     csi2      = fGapOmega  / energyeV;
@@ -698,44 +698,46 @@ Double_t AliTRDsimTR::GetMuXe(Double_t energyMeV)
                     , 5.00000E+00, 6.00000E+00, 8.00000E+00
                    , 1.00000E+01, 1.50000E+01, 2.00000E+01 };
 
-  return Interpolate(energyMeV,en,mu,kN);
+ return Interpolate(energyMeV,en,mu,kN);
 
 }
 
 //_____________________________________________________________________________
-Double_t AliTRDsimTR::GetMuBu(Double_t energyMeV)
+Double_t AliTRDsimTR::GetMuAr(Double_t energyMeV)
 {
   //
-  // Returns the photon absorbtion cross section for isobutane
+  // Returns the photon absorbtion cross section for argon
   //
 
-  const Int_t kN = 36;
-
-  Double_t mu[kN] = { 0.38846E+03, 0.12291E+03, 0.53225E+02
-                    , 0.16091E+02, 0.69114E+01, 0.36541E+01
-                    , 0.22282E+01, 0.11149E+01, 0.72887E+00
-                    , 0.45053E+00, 0.38167E+00, 0.33920E+00
-                    , 0.32155E+00, 0.30949E+00, 0.29960E+00
-                    , 0.28317E+00, 0.26937E+00, 0.24228E+00
-                    , 0.22190E+00, 0.19289E+00, 0.17288E+00
-                    , 0.15789E+00, 0.14602E+00, 0.12829E+00
-                    , 0.11533E+00, 0.10310E+00, 0.93790E-01
-                    , 0.80117E-01, 0.63330E-01, 0.53229E-01
-                    , 0.46390E-01, 0.41425E-01, 0.34668E-01
-                   , 0.30267E-01, 0.23910E-01, 0.20509E-01 };
+  const Int_t kN = 38;
 
-  Double_t en[kN] = { 0.10000E-02, 0.15000E-02, 0.20000E-02
-                    , 0.30000E-02, 0.40000E-02, 0.50000E-02
-                    , 0.60000E-02, 0.80000E-02, 0.10000E-01
-                    , 0.15000E-01, 0.20000E-01, 0.30000E-01
-                    , 0.40000E-01, 0.50000E-01, 0.60000E-01
-                    , 0.80000E-01, 0.10000E+00, 0.15000E+00
-                    , 0.20000E+00, 0.30000E+00, 0.40000E+00
-                    , 0.50000E+00, 0.60000E+00, 0.80000E+00
-                    , 0.10000E+01, 0.12500E+01, 0.15000E+01
-                    , 0.20000E+01, 0.30000E+01, 0.40000E+01
-                    , 0.50000E+01, 0.60000E+01, 0.80000E+01
-                   , 0.10000E+02, 0.15000E+02, 0.20000E+02 };
+  Double_t mu[kN] = { 3.184E+03, 1.105E+03, 5.120E+02
+                    , 1.703E+02, 1.424E+02, 1.275E+03
+                    , 7.572E+02, 4.225E+02, 2.593E+02
+                    , 1.180E+02, 6.316E+01, 1.983E+01
+                    , 8.629E+00, 2.697E+00, 1.228E+00
+                    , 7.012E-01, 4.664E-01, 2.760E-01
+                    , 2.043E-01, 1.427E-01, 1.205E-01
+                    , 9.953E-02, 8.776E-02, 7.958E-02
+                    , 7.335E-02, 6.419E-02, 5.762E-02
+                    , 5.150E-02, 4.695E-02, 4.074E-02
+                    , 3.384E-02, 3.019E-02, 2.802E-02
+                    , 2.667E-02, 2.517E-02, 2.451E-02
+                    , 2.418E-02, 2.453E-02 };
+
+  Double_t en[kN] = { 1.00000E-03, 1.50000E-03, 2.00000E-03  
+                    , 3.00000E-03, 3.20290E-03, 3.20290E-03  
+                    , 4.00000E-03, 5.00000E-03, 6.00000E-03  
+                    , 8.00000E-03, 1.00000E-02, 1.50000E-02  
+                    , 2.00000E-02, 3.00000E-02, 4.00000E-02  
+                    , 5.00000E-02, 6.00000E-02, 8.00000E-02  
+                    , 1.00000E-01, 1.50000E-01, 2.00000E-01  
+                    , 3.00000E-01, 4.00000E-01, 5.00000E-01  
+                    , 6.00000E-01, 8.00000E-01, 1.00000E+00  
+                    , 1.25000E+00, 1.50000E+00, 2.00000E+00  
+                    , 3.00000E+00, 4.00000E+00, 5.00000E+00  
+                    , 6.00000E+00, 8.00000E+00, 1.00000E+01  
+                   , 1.50000E+01, 2.00000E+01 };
 
   return Interpolate(energyMeV,en,mu,kN);
 
index d3161e0..a0b8b9c 100644 (file)
@@ -67,7 +67,7 @@ class AliTRDsimTR : public TObject {
   virtual Double_t GetMuPo(Double_t energyMeV);
   virtual Double_t GetMuCO(Double_t energyMeV);
   virtual Double_t GetMuXe(Double_t energyMeV);
-  virtual Double_t GetMuBu(Double_t energyMeV);
+  virtual Double_t GetMuAr(Double_t energyMeV);
   virtual Double_t GetMuMy(Double_t energyMeV);
   virtual Double_t GetMuN2(Double_t energyMeV);
   virtual Double_t GetMuO2(Double_t energyMeV);
index 32077a8..6056c45 100644 (file)
@@ -41,6 +41,7 @@
 #include "AliGeomManager.h"
 
 #include "AliTRDgeometry.h"
+#include "AliTRDSimParam.h"
 #include "AliTRDhit.h"
 #include "AliTRDsimTR.h"
 #include "AliTRDv1.h"
@@ -54,6 +55,7 @@ AliTRDv1::AliTRDv1()
   ,fTR(NULL)
   ,fTypeOfStepManager(0)
   ,fStepSize(0)
+  ,fWion(0)
   ,fDeltaE(NULL)
   ,fDeltaG(NULL)
   ,fTrackLength0(0)
@@ -72,6 +74,7 @@ AliTRDv1::AliTRDv1(const char *name, const char *title)
   ,fTR(NULL)
   ,fTypeOfStepManager(2)
   ,fStepSize(0.1)
+  ,fWion(0)
   ,fDeltaE(NULL)
   ,fDeltaG(NULL)
   ,fTrackLength0(0)
@@ -83,6 +86,17 @@ AliTRDv1::AliTRDv1(const char *name, const char *title)
 
   SetBufferSize(128000);
 
+  if      (AliTRDSimParam::Instance()->IsXenon()) {
+    fWion = 23.53; // Ionization energy XeCO2 (85/15)
+  }
+  else if (AliTRDSimParam::Instance()->IsArgon()) {
+    fWion = 27.21; // Ionization energy ArCO2 (82/18)
+  }
+  else {
+    AliFatal("Wrong gas mixture");
+    exit(1);
+  }
+
 }
 
 //_____________________________________________________________________________
@@ -270,9 +284,6 @@ void AliTRDv1::CreateTRhit(Int_t det)
   // volume.
   //
 
-  // Ionization energy
-  const Float_t kWion        = 23.53;
-
   // Maximum number of TR photons per track
   const Int_t   kNTR         = 50;
 
@@ -313,9 +324,17 @@ void AliTRDv1::CreateTRhit(Int_t det)
 
     // The absorbtion cross sections in the drift gas
     // Gas-mixture (Xe/CO2)
-    Double_t muXe = fTR->GetMuXe(energyMeV);
+    Double_t muNo = 0.0;
+    if      (AliTRDSimParam::Instance()->IsXenon()) {
+      muNo = fTR->GetMuXe(energyMeV);
+    }
+    else if (AliTRDSimParam::Instance()->IsArgon()) {
+      muNo = fTR->GetMuAr(energyMeV);
+    }
     Double_t muCO = fTR->GetMuCO(energyMeV);
-    sigma = (0.85 * muXe + 0.15 * muCO) * fGasDensity * fTR->GetTemp();
+    sigma = (fGasNobleFraction * muNo + (1.0 - fGasNobleFraction) * muCO) 
+          * fGasDensity 
+          * fTR->GetTemp();
 
     // The distance after which the energy of the TR photon
     // is deposited.
@@ -338,7 +357,7 @@ void AliTRDv1::CreateTRhit(Int_t det)
     posHit[2] = pos[2] + mom[2] / pTot * absLength;
 
     // Create the charge 
-    Int_t q = ((Int_t) (energyeV / kWion));
+    Int_t q = ((Int_t) (energyeV / fWion));
 
     // Add the hit to the array. TR photon hits are marked 
     // by negative charge
@@ -372,7 +391,7 @@ void AliTRDv1::Init()
     fTR = new AliTRDsimTR();
   }
 
-  // First ionization potential (eV) for the gas mixture (90% Xe + 10% CO2)
+  // First ionization potential (eV) for the gas mixture
   const Float_t kPoti = 12.1;
   // Maximum energy (50 keV);
   const Float_t kEend = 50000.0;
@@ -438,6 +457,8 @@ void AliTRDv1::StepManagerGeant()
   // to Bethe-Bloch. The energy distribution of the delta electrons follows
   // a spectrum taken from Geant3.
   //
+  // Works only for Xe/CO2!!
+  //
   // Version by A. Bercuci
   //
 
@@ -481,7 +502,6 @@ void AliTRDv1::StepManagerGeant()
   const Int_t    kNdetsec     = kNlayer * kNstack;
 
   const Double_t kBig         = 1.0e+12; // Infinitely big
-  const Float_t  kWion        = 23.53;   // Ionization energy
   const Float_t  kPTotMaxEl   = 0.002;   // Maximum momentum for e+ e- g
 
   // Minimum energy for the step size adjustment
@@ -561,7 +581,7 @@ void AliTRDv1::StepManagerGeant()
         // entering the drift volume
         if ((fTR) && 
             (TMath::Abs(gMC->TrackPid()) == kPdgElectron)) {
-          CreateTRhit(det);    
+          CreateTRhit(det);
         }
 
       }
@@ -636,7 +656,7 @@ void AliTRDv1::StepManagerGeant()
       // Generate the electron cluster size
       if (eDelta > 0.0) {
 
-        qTot = ((Int_t) (eDelta / kWion) + 1);
+        qTot = ((Int_t) (eDelta / fWion) + 1);
 
         // Create a new dEdx hit
         AddHit(gAlice->GetMCApp()->GetCurrentTrackNumber()
@@ -697,6 +717,8 @@ void AliTRDv1::StepManagerErmilova()
   // to Bethe-Bloch. The energy distribution of the delta electrons follows
   // a spectrum taken from Ermilova et al.
   //
+  // Works only for Xe/CO2!!
+  //
 
   Int_t    layer  = 0;
   Int_t    stack  = 0;
@@ -737,7 +759,6 @@ void AliTRDv1::StepManagerErmilova()
   const Int_t    kNdetsec     = kNlayer * kNstack;
 
   const Double_t kBig         = 1.0e+12; // Infinitely big
-  const Float_t  kWion        = 23.53;   // Ionization energy
   const Float_t  kPTotMaxEl   = 0.002;   // Maximum momentum for e+ e- g 
 
   // Minimum energy for the step size adjustment
@@ -808,7 +829,7 @@ void AliTRDv1::StepManagerErmilova()
         // entering the drift volume
         if ((fTR) && 
             (TMath::Abs(gMC->TrackPid()) == kPdgElectron)) {
-          CreateTRhit(det);    
+          CreateTRhit(det);
         }
 
       }
@@ -829,7 +850,7 @@ void AliTRDv1::StepManagerErmilova()
       // Generate the electron cluster size
       if (eDelta > 0.0) {
 
-        qTot = ((Int_t) (eDelta / kWion) + 1);
+        qTot = ((Int_t) (eDelta / fWion) + 1);
 
        // Create a new dEdx hit
         if (drRegion) {
@@ -902,6 +923,8 @@ void AliTRDv1::StepManagerFixedStep()
   // along its path across the drift volume. The step size is fixed in
   // this version of the step manager.
   //
+  // Works for Xe/CO2 as well as Ar/CO2
+  //
 
   // PDG code electron
   const Int_t   kPdgElectron = 11;
@@ -936,8 +959,6 @@ void AliTRDv1::StepManagerFixedStep()
   const Int_t    kNdetsec     = kNlayer * kNstack;
 
   const Double_t kBig         = 1.0e+12;
-
-  const Float_t  kWion        = 23.53;   // Ionization energy
   const Float_t  kEkinMinStep = 1.0e-5;  // Minimum energy for the step size adjustment
 
   // Set the maximum step size to a very large number for all 
@@ -1004,7 +1025,7 @@ void AliTRDv1::StepManagerFixedStep()
     // entering the drift volume
     if ((fTR) && 
         (TMath::Abs(gMC->TrackPid()) == kPdgElectron)) {
-      CreateTRhit(det);    
+      CreateTRhit(det);
     }
 
   }
@@ -1022,7 +1043,7 @@ void AliTRDv1::StepManagerFixedStep()
   // Calculate the charge according to GEANT Edep
   // Create a new dEdx hit
   eDep = TMath::Max(gMC->Edep(),0.0) * 1.0e+09;
-  qTot = (Int_t) (eDep / kWion);
+  qTot = (Int_t) (eDep / fWion);
   if ((qTot) ||
       (trkStat)) {
     AddHit(gAlice->GetMCApp()->GetCurrentTrackNumber()
index c4a3880..5138ef8 100644 (file)
@@ -63,19 +63,22 @@ class AliTRDv1 : public AliTRD {
           Double_t fStepSize;           //  Used for the fixed step size
 
  private:
+
   AliTRDv1(const AliTRDv1 &trd);
   AliTRDv1 &operator=(const AliTRDv1 &trd);
 
           Double_t BetheBloch(Double_t bg);
           Double_t BetheBlochGeant(Double_t bg);
   
+          Float_t  fWion;               //  Ionization potential
+
           TF1     *fDeltaE;             //  Energy distribution of the delta-electrons (Ermilova)
           TF1     *fDeltaG;             //  Energy distribution of the
 
           Float_t  fTrackLength0;       //  Save the track length at chamber entrance  
           Int_t           fPrimaryTrackPid;    //  Save the id of the primary track  
 
-  ClassDef(AliTRDv1,6)                  //  Transition Radiation Detector version 1 (slow simulator)
+  ClassDef(AliTRDv1,7)                  //  Transition Radiation Detector version 1 (slow simulator)
 
 };