]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - TFluka/TFlukaScoringOption.cxx
Possibility to define Fluka specific scoring options added.
[u/mrichter/AliRoot.git] / TFluka / TFlukaScoringOption.cxx
index 5bd9e971238e41663eb8fb64ad94e3b9db80f314..b8bc89064536db0faf90966085729c77abf9ecaa 100644 (file)
 /* $Id$*/
 
 #include "TFlukaScoringOption.h"
+#include "TFlukaMCGeometry.h"
+#include <TGeoManager.h>
+#include <TGeoVolume.h>
+
 ClassImp(TFlukaScoringOption);
 
+FILE*              TFlukaScoringOption::fgFile(0x0);
+TFlukaMCGeometry*  TFlukaScoringOption::fgGeom(0x0);
 
 TFlukaScoringOption::TFlukaScoringOption()
 {
     // Default constructor
 }
 
+TFlukaScoringOption::TFlukaScoringOption(const char* name, const char* sdum, Int_t nopfl, char* outfile, Float_t* what)
+    : TNamed(name, sdum)
+{
+    // Constructor
+    fNopfl   = nopfl;
+    fOutFile = outfile;
+    Int_t npar = (nopfl == 0)? 6 : 12;
+    for (Int_t i = 0; i < npar; i++)  fWhat[i] = what[i];
+}
 
-TFlukaScoringOption::TFlukaScoringOption(const char* name, const char* sdum, Int_t npar,  Float_t what[12])
+TFlukaScoringOption::TFlukaScoringOption(const char* name, const char* sdum, Int_t nopfl, char* outfile, Float_t* what, 
+                                        const char* det1, const char* det2, const char* det3)
     : TNamed(name, sdum)
 {
     // Constructor
-    fNpar = npar;
-    for (Int_t i = 0; i < 12; i++) fWhat[i] = what[i];
+    fNopfl   = nopfl + 2;
+    fOutFile = outfile;
+    Int_t npar = (nopfl == 0)? 6 : 12;
+    for (Int_t i = 0; i < npar; i++)  fWhat[i] = what[i];
+
+    fName[0] = det1;
+    fName[1] = det2;
+    fName[2] = det3;
+}
+
+
+//--- GET METHODS
+//______________________________________________
+const char* TFlukaScoringOption::GetRegName(Int_t ndet) 
+{
+    // Return ndet'th region name
+    return fName[ndet - 1];
+}
+
+//
+// Write Fluka Input Cards
+//
+void TFlukaScoringOption::WriteOpenFlukaFile()
+{
+    //
+    // Write Fluka input card for output file opening
+    // 
+    fprintf(fgFile, "OPEN      %10.1f                                                    %s\n", 
+           GetLun(), "NEW");     
+    fprintf(fgFile, "%s\n", GetFileName());
 }
+
+
+void TFlukaScoringOption::WriteFlukaInputCards()
+{
+    //
+    // Write the Fluka Input Cards for this scoring option
+    //
+
+    const char* cont_line = "&";
+
+//***************************************************************************
+//*    Par()==0  only 6 parameter && regions by float                       *
+//*    Par()==1  only 6 parameter && regions by Name                        *
+//*    Par()==2      12 parameter && regions by float                       *
+//*    Par()==3      12 parameter && regions by Name                        *
+//*    Par()==4      12 parameter && regions by Name (for USRBIN only)      *
+//***************************************************************************
+//
+// USRBIN
+//
+    if(strncmp(GetName(), "USRBIN", 6) == 0){
+       if (Par() == 0) {
+           fprintf(fgFile, "USRBIN    %10.1f%10.1f%10.1f%10.1f%10.1f%10.1f\n", 
+                   What(1), What(2), GetLun(), What(4), What(5), What(6));
+       } else if (Par() == 1) {
+           fprintf(fgFile, "USRBIN    %10.1f%10.1f%10.1f%10.1f%10.1f%10.1f\n",  
+                   What(1), What(2), GetLun(), What(4), What(5),  What(6));
+           fprintf(fgFile, "USRBIN    %10.1f%10.4g%10.1f%10.1f%10.1f%10.1f  %s\n",  
+                   What(7), What(8), What(9), What(10), What(11), What(12), cont_line);
+       } else if (Par() == 2) {
+           if(What(1) == 2.0 || What(1) == 12){
+               fprintf(fgFile, "USRBIN    %10.1f%10.1f%10.1f%10.1f%10.1f%10.1f\n",  
+                       What(1), What(2), GetLun(), Float_t(GetRegionByName(GetRegName(1))),
+                       Float_t(GetRegionByName(GetRegName(2))), Float_t(GetRegionByName(GetRegName(3))));
+               fprintf(fgFile, "USRBIN    %10.1f%10.4g%10.1f%10.1f%10.1f%10.1f  %s\n",  
+                       Float_t(GetRegionByName(GetRegName(1))), Float_t(GetRegionByName(GetRegName(2))),
+                       Float_t(GetRegionByName(GetRegName(3))), 1., 1., 1., cont_line);
+           } else {
+               printf("Check consistency of SetUserScoring values \n");
+           }
+       }
+    }
+   
+//
+// USRBDX
+//
+    if(strncmp(GetName(), "USRBDX", 6) == 0){
+       if (Par() == 2) {
+           fprintf(fgFile, "USRBDX    %10.1f%10.1f%10.1f%10.1f%10.1f%10.1f\n", 
+                   What(1), What(2), GetLun(), Float_t(GetRegionByName(GetRegName(1))), 
+                   Float_t(GetRegionByName(GetRegName(2))), What(6));
+       } else if (Par() == 3) {
+           fprintf(fgFile, "USRBDX    %10.1f%10.1f%10.1f%10.1f%10.1f%10.1f\n",  
+                   What(1), What(2), GetLun(), Float_t(GetRegionByName(GetRegName(1))),
+                   Float_t(GetRegionByName(GetRegName(2))), What(6));
+           fprintf(fgFile, "USRBDX    %10.1f%10.4g%10.1f%10.1f%10.1f%10.1f  %s\n",  
+                   What(7), What(8), What(9), What(10), What(11), What(12), cont_line);              
+       }
+    }
+    
+//
+// USTRACK
+//
+    if(strncmp(GetName(), "USRTRACK", 6) == 0){
+       fprintf(fgFile, "USRTRACK  %10.1f%10.1f%10.1f%10.1f%10.1f%10.1f\n",  
+               What(1), What(2), GetLun(), Float_t(GetRegionByName(GetRegName(1))), What(4), What(5));
+       fprintf(fgFile, "USRTRACK  %10.1f%10.4g                                          %s\n",  
+               What(7), What(8), cont_line);
+    }
+    
+//
+// USRCOLL
+// 
+    if(strncmp(GetName(), "USRCOLL", 6) == 0){
+       fprintf(fgFile, "USRCOLL   %10.1f%10.1f%10.1f%10.1f%10.1f%10.1f\n",  
+               What(1), What(2), GetLun(), Float_t(GetRegionByName(GetRegName(1))), What(4), What(5));
+       fprintf(fgFile, "USRCOLL   %10.1f%10.4g                                          %s\n",  
+               What(7), What(8), cont_line);         
+    }
+}
+
+
+Int_t TFlukaScoringOption::GetRegionByName(const char* detname)
+{
+// Get number of region for a given detector name
+    TGeoVolume* vol = dynamic_cast<TGeoVolume*>((gGeoManager->GetListOfVolumes())->FindObject(detname));
+    Int_t ireg = (vol)? vol->GetNumber() : -999;
+    return ireg;
+}