Introducing Riostream.h
[u/mrichter/AliRoot.git] / TFluka / TFluka.cxx
1 /**************************************************************************
2  * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
3  *                                                                        *
4  * Author: The ALICE Off-line Project.                                    *
5  * Contributors are mentioned in the code where appropriate.              *
6  *                                                                        *
7  * Permission to use, copy, modify and distribute this software and its   *
8  * documentation strictly for non-commercial purposes is hereby granted   *
9  * without fee, provided that the above copyright notice appears in all   *
10  * copies and that both the copyright notice and this permission notice   *
11  * appear in the supporting documentation. The authors make no claims     *
12  * about the suitability of this software for any purpose. It is          *
13  * provided "as is" without express or implied warranty.                  *
14  **************************************************************************/
15
16 /*
17 $Log$
18 Revision 1.2  2002/10/14 14:57:40  hristov
19 Merging the VirtualMC branch to the main development branch (HEAD)
20
21 Revision 1.1.2.8  2002/10/08 16:33:17  iglez2
22 LSOUIT is set to true before the second call to flukam.
23
24 Revision 1.1.2.7  2002/10/08 09:30:37  iglez2
25 Solved stupid missing ;
26
27 Revision 1.1.2.6  2002/10/07 13:40:22  iglez2
28 First implementations of the PDG <--> Fluka Id conversion routines
29
30 Revision 1.1.2.5  2002/09/26 16:26:03  iglez2
31 Added verbosity
32 Call to gAlice->Generator()->Generate()
33
34 Revision 1.1.2.4  2002/09/26 13:22:23  iglez2
35 Naive implementation of ProcessRun and ProcessEvent
36 Opening/Closing of input file (fInputFileName) with FORTRAN unit 5 before/after the first call to flukam inside Init()
37
38 Revision 1.1.2.3  2002/09/20 15:35:51  iglez2
39 Modification of LFDRTR. Value is passed to FLUKA !!!
40
41 Revision 1.1.2.2  2002/09/18 14:34:44  iglez2
42 Revised version with all pure virtual methods implemented
43
44 Revision 1.1.2.1  2002/07/24 08:49:41  alibrary
45 Adding TFluka to VirtualMC
46
47 Revision 1.1  2002/07/05 13:10:07  morsch
48 First commit of Fluka interface.
49
50 */
51
52 #include <Riostream.h>
53
54 #include "TFluka.h"
55 #include "TCallf77.h"      //For the fortran calls
56 #include "Fdblprc.h"       //(DBLPRC) fluka common
57 #include "Fiounit.h"       //(IOUNIT) fluka common
58 #include "Fepisor.h"       //(EPISOR) fluka common
59 #include "TVirtualMC.h"
60
61 // Fluka methods that may be needed.
62 #ifndef WIN32 
63 # define flukam  flukam_
64 # define fluka_openinp fluka_openinp_
65 # define fluka_closeinp fluka_closeinp_
66 #else 
67 # define flukam  FLUKAM
68 # define fluka_openinp FLUKA_OPENINP
69 # define fluka_closeinp FLUKA_CLOSEINP
70 #endif
71
72 extern "C" 
73 {
74   //
75   // Prototypes for FLUKA functions
76   //
77   void type_of_call flukam(const int&);
78   void type_of_call fluka_openinp(const int&, DEFCHARA);
79   void type_of_call fluka_closeinp(const int&);
80 }
81
82 //
83 // Class implementation for ROOT
84 //
85 ClassImp(TFluka)
86
87 //
88 // TFluka methods.
89 //____________________________________________________________________________ 
90 TFluka::TFluka()
91   :TVirtualMC(),
92    fVerbosityLevel(0),
93    fInputFileName("")
94
95   //
96   // Default constructor
97   //
98
99  
100 //____________________________________________________________________________ 
101 TFluka::TFluka(const char *title, Int_t verbosity)
102   :TVirtualMC("TFluka",title),
103    fVerbosityLevel(verbosity),
104    fInputFileName("")
105 {
106   if (fVerbosityLevel >=3)
107     cout << "==> TFluka::TFluka(" << title << ") constructor called." << endl;
108
109   if (fVerbosityLevel >=3)
110     cout << "<== TFluka::TFluka(" << title << ") constructor called." << endl;
111 }
112
113 //____________________________________________________________________________ 
114 void TFluka::Init() {
115   if (fVerbosityLevel >=3)
116     cout << "==> TFluka::Init() called." << endl;
117
118   if (fVerbosityLevel >=2)
119     cout << "\t* Changing lfdrtr = (" << (GLOBAL.lfdrtr?'T':'F')
120          << ") in fluka..." << endl;
121   GLOBAL.lfdrtr = true;
122
123   if (fVerbosityLevel >=2)
124     cout << "\t* Opening file " << fInputFileName << endl;
125   const char* fname = fInputFileName;
126   fluka_openinp(lunin, PASSCHARA(fname));
127
128   if (fVerbosityLevel >=2)
129     cout << "\t* Calling flukam..." << endl;
130   flukam(0);
131
132   if (fVerbosityLevel >=2)
133     cout << "\t* Closing file " << fInputFileName << endl;
134   fluka_closeinp(lunin);
135
136   if (fVerbosityLevel >=3)
137     cout << "<== TFluka::Init() called." << endl;
138 }
139
140 //____________________________________________________________________________ 
141 void TFluka::ProcessEvent() {
142   if (fVerbosityLevel >=3)
143     cout << "==> TFluka::ProcessEvent() called." << endl;
144
145   if (fVerbosityLevel >=3)
146     cout << "<== TFluka::ProcessEvent() called." << endl;
147 }
148
149 //____________________________________________________________________________ 
150 void TFluka::ProcessRun(Int_t nevent) {
151   if (fVerbosityLevel >=3)
152     cout << "==> TFluka::ProcessRun(" << nevent << ") called." 
153          << endl;
154
155   if (fVerbosityLevel >=2) {
156     cout << "\t* GLOBAL.fdrtr = " << (GLOBAL.lfdrtr?'T':'F') << endl;
157     cout << "\t* Calling flukam again..." << endl;
158   }
159   fApplication->GeneratePrimaries();
160   EPISOR.lsouit = true;
161   flukam(0);
162
163   if (fVerbosityLevel >=3)
164     cout << "<== TFluka::ProcessRun(" << nevent << ") called." 
165          << endl;
166 }
167
168 //_____________________________________________________________________________
169 Int_t TFluka::IdFromPDG(Int_t pdg) const 
170 {
171   //
172   // Return Geant3 code from PDG and pseudo ENDF code
173   //
174   for(Int_t i=0;i<fNPDGCodes;++i)
175     if(pdg==fPDGCode[i])
176       return i;
177   return -99;
178 }
179
180 //_____________________________________________________________________________
181 Int_t TFluka::PDGFromId(Int_t id) const 
182 {
183   //
184   // Return PDG code and pseudo ENDF code from Geant3 code
185   //
186   if(id>0 && id<fNPDGCodes) 
187     return fPDGCode[id];
188   else 
189     return -1;
190 }
191
192 //_____________________________________________________________________________
193 void TFluka::DefineParticles() 
194 {
195   // Load standard numbers for GEANT particles and PDG conversion
196   fPDGCode[fNPDGCodes++]=  -99; //  0 = Psudoparticle (Ray)
197   fPDGCode[fNPDGCodes++]= 2212; //  1 = Proton
198   fPDGCode[fNPDGCodes++]=-2212; //  2 = Anti Proton
199   fPDGCode[fNPDGCodes++]=   11; //  3 = Electron
200   fPDGCode[fNPDGCodes++]=  -11; //  4 = Positron
201   fPDGCode[fNPDGCodes++]=   12; //  5 = Electron Neutrino
202   fPDGCode[fNPDGCodes++]=  -12; //  6 = Electron Antineutrino
203   fPDGCode[fNPDGCodes++]=   22; //  7 = Photon
204   fPDGCode[fNPDGCodes++]= 2112; //  8 = Neutron
205   fPDGCode[fNPDGCodes++]=-2112; //  9 = Anti Neutron
206   fPDGCode[fNPDGCodes++]=  -13; // 10 = Mu+
207   fPDGCode[fNPDGCodes++]=   13; // 11 = Mu-
208   fPDGCode[fNPDGCodes++]=  130; // 12 = Kaon 0 long
209   fPDGCode[fNPDGCodes++]=  211; // 13 = Pi+
210   fPDGCode[fNPDGCodes++]= -211; // 14 = Pi-
211   fPDGCode[fNPDGCodes++]=  321; // 15 = Kaon+
212   fPDGCode[fNPDGCodes++]= -321; // 16 = Kaon-
213   fPDGCode[fNPDGCodes++]= 3122; // 17 = Lambda
214   fPDGCode[fNPDGCodes++]=-3122; // 18 = Anti Lambda
215   fPDGCode[fNPDGCodes++]=  310; // 19 = Kaon 0 short
216   fPDGCode[fNPDGCodes++]= 3112; // 20 = Sigma -
217   fPDGCode[fNPDGCodes++]= 3222; // 21 = Sigma +
218   fPDGCode[fNPDGCodes++]= 3212; // 22 = Sigma 0
219   fPDGCode[fNPDGCodes++]=  111; // 23 = Pi0
220   fPDGCode[fNPDGCodes++]=  311; // 24 = Kaon 0
221   fPDGCode[fNPDGCodes++]= -311; // 25 = Antikaon 0
222   fPDGCode[fNPDGCodes++]=  -99; // 26 = --Reserved
223   fPDGCode[fNPDGCodes++]=   14; // 27 = Muon neutrino
224   fPDGCode[fNPDGCodes++]=  -14; // 28 = Muon antineutrino
225   fPDGCode[fNPDGCodes++]=  -99; // 29 = --Reserved
226   fPDGCode[fNPDGCodes++]=  -99; // 30 = --Reserved
227   fPDGCode[fNPDGCodes++]=-3222; // 31 = Antisigma -
228   fPDGCode[fNPDGCodes++]=-3212; // 32 = Antisigma 0
229   fPDGCode[fNPDGCodes++]=-3112; // 33 = Antisigma +
230   fPDGCode[fNPDGCodes++]= 3322; // 34 = Xi 0
231   fPDGCode[fNPDGCodes++]=-3322; // 35 = AntiXi 0
232   fPDGCode[fNPDGCodes++]= 3312; // 36 = Xi -
233   fPDGCode[fNPDGCodes++]=-3312; // 37 = Xi +
234   fPDGCode[fNPDGCodes++]= 3334; // 38 = Omega -
235   fPDGCode[fNPDGCodes++]=-3334; // 39 = Antiomega
236   fPDGCode[fNPDGCodes++]=  -99; // 40 = --Reserved
237   fPDGCode[fNPDGCodes++]=  -15; // 41 = Tau+
238   fPDGCode[fNPDGCodes++]=   15; // 42 = Tau-
239   fPDGCode[fNPDGCodes++]=   16; // 43 = Tau neutrino
240   fPDGCode[fNPDGCodes++]=  -16; // 44 = Tau antineutrino
241   fPDGCode[fNPDGCodes++]=  411; // 45 = D+
242   fPDGCode[fNPDGCodes++]= -411; // 46 = D-
243   fPDGCode[fNPDGCodes++]=  421; // 47 = D0
244   fPDGCode[fNPDGCodes++]= -421; // 48 = AntiD 0
245   fPDGCode[fNPDGCodes++]=  431; // 49 = D_s +
246   fPDGCode[fNPDGCodes++]= -431; // 50 = D_s -
247   fPDGCode[fNPDGCodes++]= 4122; // 51 = Lambda_c +
248   fPDGCode[fNPDGCodes++]= 4232; // 52 = Xi_c +
249   fPDGCode[fNPDGCodes++]= 4112; // 53 = Xi_c -
250   fPDGCode[fNPDGCodes++]= 4322; // 54 = Xi'_c +
251   fPDGCode[fNPDGCodes++]= 4312; // 55 = Xi'_c 0
252   fPDGCode[fNPDGCodes++]= 4332; // 56 = Omega_c 0
253   fPDGCode[fNPDGCodes++]=-4122; // 57 = Antilambda_c -
254   fPDGCode[fNPDGCodes++]=-4232; // 58 = Antixsi_c -
255   fPDGCode[fNPDGCodes++]=-4112; // 59 = Antixsi_c 0
256   fPDGCode[fNPDGCodes++]=-4322; // 60 = AntiXi'_c -
257   fPDGCode[fNPDGCodes++]=-4312; // 61 = AntiXi'_c 0
258   fPDGCode[fNPDGCodes++]=-4332; // 62 = AntiOmega_c 0
259   fPDGCode[fNPDGCodes++]=  -99; // 63 = --Reserved
260   fPDGCode[fNPDGCodes++]=  -99; // 64 = --Reserved
261 }