/[PAMELA software]/PamVMC/src/PamVMCApplication.cxx
ViewVC logotype

Diff of /PamVMC/src/PamVMCApplication.cxx

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 1.1 by nikolas, Thu Jun 28 07:16:57 2007 UTC revision 1.5 by pam-rm2, Fri Jun 12 18:39:29 2009 UTC
# Line 1  Line 1 
1  // $Id: PamVMCApplication.cxx,v 1.0 2007/06/01  // $Id: PamVMCApplication.cxx,v 1.0 2007/06/01
2  //  //
3  // Geant4 ExampleN06 adapted to Virtual Monte Carlo  // Geant4 PAMELA VMC
4  #include <cstdlib>  #include <cstdlib>
5  #include <string>  #include <string>
6    #include <iostream>
7  #include <TROOT.h>  #include <TROOT.h>
8  #include <TInterpreter.h>  #include <TInterpreter.h>
9  #include <TVirtualMC.h>  #include <TVirtualMC.h>
10  #include <Riostream.h>  #include <Riostream.h>
11  #include <TGeoManager.h>  #include <TGeoManager.h>
12  #include <TVirtualGeoTrack.h>  #include <TVirtualGeoTrack.h>
13    #include <TLorentzVector.h>
14  #include "PamVMCApplication.h"  #include "PamVMCApplication.h"
15  #include "PamVMCStack.h"  #include "PamVMCStack.h"
 #include "PamVMCDetectorConstruction.h"  
16  #include "PamVMCPrimaryGenerator.h"  #include "PamVMCPrimaryGenerator.h"
17    
18    #include "PamVMCFieldMgr.h"
19    
20    #include "PamVMCSDMgr.h"
21    
22    #include "PamVMCVolCrossMgr.h"
23    
24    #include "PamVMCDetPamela.h"
25    
26    //#include "TFluka.h"
27    
28    
29    
30  ClassImp(PamVMCApplication)  ClassImp(PamVMCApplication)
31    
32  PamVMCApplication::PamVMCApplication(const char *name, const char *title)  PamVMCApplication::PamVMCApplication(const char *name, const char *title, const char* filename, Int_t seed)
33    : TVirtualMCApplication(name,title),    : TVirtualMCApplication(name,title),
34      fEventNo(0),      fEventNo(0),
35      fVerbose(0),      fVerbose(2),
36      fStack(0),      fStack(0),
37      fDetConstruction(0),      fdetector(0),
38      fPrimaryGenerator(0)      fPrimaryGenerator(0),
39        fRootManager(filename,kWrite)
40  {  {
41  // Standard constructor  // Standard constructor
42    
43    // Create a user stack    // Create a user stack
44      fStack = new PamVMCStack(10000);    fStack = new PamVMCStack(1000);
45          
   // Create detector construction  
   fDetConstruction = new PamVMCDetectorConstruction();  
     
46    // Create a primary generator    // Create a primary generator
47    fPrimaryGenerator = new PamVMCPrimaryGenerator(fStack);    fPrimaryGenerator = new PamVMCPrimaryGenerator(fStack);
 #ifdef PAMFIELD  
   // Load the PAMELA magnetic field  
48    
49    std::string pamcal=getenv("PAM_CALIB"); pamcal+="/trk-param/field_param-0/";    //Create random object
50    std::cout << "PAMELA env: " << pamcal << std::endl;    frandom = new TRandom3(seed);
   pamfield.LoadField(pamcal.c_str());  
 #endif  
 }  
51    
52      fdetector = new PamVMCDetPamela();
53    
54  PamVMCApplication::PamVMCApplication()    PamVMCFieldMgr::Instance()->LoadField();
55    : TVirtualMCApplication(),    
56      fEventNo(0),    TString fname=filename; fname+=".pam";
57      fVerbose(0),  
58      fStack(0),    PamVMCRawMgr::Instance()-> CreateOutFile(fname.Data());
     fDetConstruction(0),  
     fPrimaryGenerator(0)  
 {      
 // Default constructor  
59  }  }
60    
61    
62  PamVMCApplication::~PamVMCApplication()  PamVMCApplication::~PamVMCApplication()
63  {  {
64  // Destructor    // Destructor  
65        delete frandom;
66    delete fStack;    delete fStack;
67    delete fDetConstruction;    delete fdetector;
68    delete fPrimaryGenerator;    delete fPrimaryGenerator;
69    delete gMC;    delete gMC;
70    gMC = 0;    gMC = 0;
71  }  }
72    
 //  
 // public methods  
 //  
73    
74  void PamVMCApplication::InitMC(const char* setup)  void PamVMCApplication::InitMC(const char* setup)
75  {      {    
# Line 77  void PamVMCApplication::InitMC(const cha Line 77  void PamVMCApplication::InitMC(const cha
77    
78    fVerbose.InitMC();    fVerbose.InitMC();
79    
80      gROOT->LoadMacro(setup);    gROOT->LoadMacro(setup);
81      gInterpreter->ProcessLine("Config()");    gInterpreter->ProcessLine("Config()");
82      gMC->SetStack(fStack);    gMC->SetStack(fStack);
83      gMC->Init();    gMC->SetRandom(frandom);
84      gMC->BuildPhysics();    
85      std::cout<<"!!! BEFORE INIT GMC"<<std::endl;
86      
87      gMC->Init();
88      cout<<"INIT MC"<<endl;
89      gMC->BuildPhysics();
90      cout<<"PHYSICS BUILDED"<<endl;
91    
92    #if ROOT_VERSION_CODE >= 333572    
93      gMC->SetMagField(PamVMCFieldMgr::Instance());
94      cout<<"Magnetic field setted"<<endl;
95    #endif
96    
97      fdetector->InitMC();
98      
99      // fdetector->Print();
100      
101      PamVMCSDMgr::Instance()->Register();
102      
103      PamVMCDigMgr::Instance()->Initialize(gMC->GetRandom());
104    
105      PamVMCRawMgr::Instance()->WriteToFile();
106      
107      fPrimaryGenerator->SetRandom(gMC->GetRandom());
108      fPrimaryGenerator->Register();
109      
110      std::cout<<"LIST OF ACTIVE SD'S:"<<std::endl;
111      
112      PamVMCSDMgr::Instance()->Print();
113  }  }
114    
115  void PamVMCApplication::RunMC(Int_t nofEvents)  void PamVMCApplication::RunMC(Int_t nofEvents)
116  {      {    
117  // MC run.     // MC run.
118    
119    fVerbose.RunMC(nofEvents);    fVerbose.RunMC(nofEvents);
120    
121    gMC->ProcessRun(nofEvents);    gMC->ProcessRun(nofEvents);
122    
123    ////  fVerbose.FinishRun();    fVerbose.FinishRun();
124  }  }
125    
126    void PamVMCApplication::AddIons(){
127    
128      fVerbose.AddIons();
129      //Arguments are:
130      //name
131      //Z (atomic number)
132      //A (atomic mass)
133      //Q (charge eplus)
134      //exitation exitation energy [GeV] 0. if in ground state
135      //mass [GeV], if not specified, calculated approx
136    
137      gMC->DefineIon("He3",2,3,2,0.,2.808);
138      gMC->DefineIon("He4",2,4,2,0.,3.727);
139    
140      //gMC->DefineIon("He7",2,7,2,0.);
141      //gMC->DefineIon("Boron",5,10,5,0.);  
142      //gMC->DefineIon("Carbon",6,12,6,0.);
143    }
144    
145    
146  void PamVMCApplication::ConstructGeometry()  void PamVMCApplication::ConstructGeometry()
147  {      {    
148  // Construct geometry using detector contruction class    // Construct geometry using detector contruction class
149    
150    fVerbose.ConstructGeometry();    fVerbose.ConstructGeometry();
151    fDetConstruction->ConstructGeometry();    new TGeoManager("PAM_GEOM","PAMELA GEOMETRY");
152            fdetector->ConstructGeometry();
153      //TGeoManager::Import("/home/pamela/PamCAL210508/gp2tgeo.root");
154      gGeoManager->CloseGeometry();
155      gMC->SetRootGeometry();
156    
157      cout<<"!!CONSTRUCT GEOMETRY!!"<<endl;
158      fdetector->ConstructCuts();
159    
160  }  }
161    
162  void PamVMCApplication::InitGeometry()  void PamVMCApplication::InitGeometry()
163  {      {    
164  // Initialize geometry    // Initialize geometry
165        
166    fVerbose.InitGeometry();    cout<<"!!SETUP CUTS"<<endl;
167      //fdetector->InitGeometry();
168    
169      fVerbose.InitGeometry();
170  }  }
171    
172    
173  void PamVMCApplication::GeneratePrimaries()  void PamVMCApplication::GeneratePrimaries()
174  {      {    
175  // Fill the user stack (derived from TVirtualMCStack) with primary particles.    // Fill the user stack (derived from TVirtualMCStack) with primary particles.
176        
177    ///// fVerbose.GeneratePrimaries();    fPrimaryGenerator->GeneratePrimary();
   
   fPrimaryGenerator->GeneratePrimaries();  
178  }  }
179    
180  void PamVMCApplication::BeginEvent()  void PamVMCApplication::BeginEvent()
181  {      {    
182  // User actions at beginning of event  // User actions at beginning of event
183      PamVMCSDMgr::Instance()->PreEvent();
   ///// fVerbose.BeginEvent();  
   
184    fEventNo++;    fEventNo++;
185   }  }
186    
187  void PamVMCApplication::BeginPrimary()  void PamVMCApplication::BeginPrimary()
188  {      {    
189  // User actions at beginning of a primary track  // User actions at beginning of a primary track
190      fPrimaryGenerator->SetGood(kTRUE);
191  ////  fVerbose.BeginPrimary();    fVerbose.BeginPrimary();
192  }  }
193    
194  void PamVMCApplication::PreTrack()  void PamVMCApplication::PreTrack()
195  {      {    
196  // User actions at beginning of each track  // User actions at beginning of each track
197    
198    }
199    
200    ////// fVerbose.PreTrack();  
201      #define CAVITY_X 8.07
202    #define CAVITY_Y 6.57
203    #define ZCAVITY_MIN 27.399
204    #define ZCAVITY_MAX 71.059
205    
206    
207    Bool_t PamVMCApplication::IsInsideCavity(){
208      Double_t x,y,z;
209      gMC->TrackPosition(x,y,z);
210      if( (z<ZCAVITY_MIN) || (z>ZCAVITY_MAX)) return kTRUE;
211      if( (TMath::Abs(x) > CAVITY_X) || (TMath::Abs(y) > CAVITY_Y)) return kFALSE;
212      return kTRUE;
213  }  }
214    
215    
216  void PamVMCApplication::Stepping()  void PamVMCApplication::Stepping()
217  {      {    
218      if (fStack->GetCurrentTrack()->IsPrimary()){
219        if(!IsInsideCavity()) fPrimaryGenerator->SetGood(kFALSE);
220      }
221      
222  // User actions at each step  // User actions at each step
223      fVerbose.Stepping();
224  //////  fVerbose.Stepping();    PamVMCDetectorSD* temp=(PamVMCDetectorSD*) PamVMCSDMgr::Instance()->GetSD(gMC->CurrentVolName());
225      if(temp){
226        fdstatus=INSIDE;
227        if(gMC->IsTrackEntering()){ fdstatus=ENTERING; }
228        if(gMC->IsTrackExiting() || gMC->IsTrackOut() || gMC->IsTrackStop() ) { fdstatus=EXITING;}
229        temp->FillHit(fdstatus,gMC,fStack->GetCurrentTrack()->IsPrimary());    
230      }
231      
232  }  }
233    
234  void PamVMCApplication::PostTrack()  void PamVMCApplication::PostTrack()
235  {      {    
236  // User actions after finishing of each track  // User actions after finishing of each track
237    
   
   ///// fVerbose.PostTrack();  
238  }  }
239    
240  void PamVMCApplication::FinishPrimary()  void PamVMCApplication::FinishPrimary()
241  {      {    
242  // User actions after finishing of a primary track  // User actions after finishing of a primary track
243      //fPrimaryGenerator->SetGood(PamVMCVolCrossMgr::Instance()->IsTrackGood());
244    ///// fVerbose.FinishPrimary();    //PamVMCVolCrossMgr::Instance()->Reset();
245      fVerbose.FinishPrimary();
246  }  }
247    
248  void PamVMCApplication::FinishEvent()  void PamVMCApplication::FinishEvent()
249  {      {    
250  // User actions after finishing of an event  // User actions after finishing of an event
251    
252        
253    
254    /////fVerbose.FinishEvent();      PamVMCSDMgr::Instance()->Digitize();
255          //EventNo needs for trigger, particle PDG needs for TOF..
256        PamVMCDigMgr::Instance()->Digitize(fEventNo,fPrimaryGenerator->GetParticle());
257    
258        PamVMCSDMgr::Instance()->Compress();
259    
260        PamVMCRawMgr::Instance()->WriteEvent();
261    
262        fRootManager.Fill();
263    
264        fPrimaryGenerator->ClearPrimCol();
265    
266    fStack->Reset();      PamVMCSDMgr::Instance()->Clear();
267    
268        fStack->Reset();
269      
270  }  }
271    
272  void PamVMCApplication::Field(const Double_t* x, Double_t* b) const  void PamVMCApplication::FinishRun()
273  {  {
274  // Uniform magnetic field    fVerbose.FinishRun();
275      
276      fRootManager.WriteAll();
277    
278  #ifdef PAMFIELD    PamVMCDigMgr::Instance()->FinishRun(); //write RunTrailer to buffer
279       b[0] = pamfield.GetBX((float *)x);  
280       b[1] = pamfield.GetBY((float *)x);    PamVMCRawMgr::Instance()->FinishRun(); //write RunTrailer to file and close;
281       b[2] = pamfield.GetBZ((float *)x);  
282  #else    PamVMCDigMgr::Instance()->PrintCollections();
283     for (Int_t i=0; i<3; i++) b[i] = 0.0;  
284  #endif  }
285    
286    #if ROOT_VERSION_CODE < 333572  
287    void PamVMCApplication::Field(const Double_t* x, Double_t* b) const
288    {
289      PamVMCFieldMgr::Instance()->Field(x,b);
290  }  }
291    #endif

Legend:
Removed from v.1.1  
changed lines
  Added in v.1.5

  ViewVC Help
Powered by ViewVC 1.1.23