2 #include "TVirtualMCApplication.h"
3 #include "TGeoMaterial.h"
4 #include "TGeoManager.h"
6 #include "TFlukaCerenkov.h"
9 #include "TFlukaCodes.h"
11 #include "Fdimpar.h" //(DIMPAR) fluka include
12 #include "Ftrackr.h" //(TRACKR) fluka common
13 #include "Fltclcm.h" //(LTCLCM) fluka common
14 #include "Fpaprop.h" //(PAPROP) fluka common
17 # define endraw endraw_
19 # define endraw ENDRAW
22 void endraw(Int_t& icode, Int_t& mreg, Double_t& rull, Double_t& xsco, Double_t& ysco, Double_t& zsco)
24 TFluka* fluka = (TFluka*) gMC;
25 // nothing to do if particle in dummy region
26 if (mreg == fluka->GetDummyRegion()) return;
27 Int_t verbosityLevel = fluka->GetVerbosityLevel();
28 Bool_t debug = (verbosityLevel >= 3)? kTRUE : kFALSE;
29 Int_t mlttc = LTCLCM.mlatm1;
30 fluka->SetCaller(kENDRAW);
35 fluka->SetMreg(mreg, mlttc);
39 if (TRACKR.jtrack == -1) {
40 // Handle quantum efficiency the G3 way
41 if (debug) printf("endraw: Cerenkov photon depositing energy: %d %e\n", mreg, rull);
42 TGeoMaterial* material = (gGeoManager->GetCurrentVolume())->GetMaterial();
43 TFlukaCerenkov* cerenkov = dynamic_cast<TFlukaCerenkov*> (material->GetCerenkovProperties());
45 Double_t eff = (cerenkov->GetQuantumEfficiency(rull));
46 if (gRandom->Rndm() > eff) {
52 TVirtualMCStack* cppstack = fluka->GetStack();
53 Int_t saveTrackId = cppstack->GetCurrentTrackNumber();
56 cout << "ENDRAW For icode=" << icode << " stacktrack=" << saveTrackId
57 << " track=" << TRACKR.ispusr[mkbmx2-1] << " pdg=" << fluka->PDGFromId(TRACKR.jtrack)
58 << " edep="<< edep <<endl;
61 if (icode != kEMFSCOstopping1 && icode != kEMFSCOstopping2) {
62 fluka->SetIcode((FlukaProcessCode_t)icode);
64 if (icode == kKASKADelarecoil && TRACKR.ispusr[mkbmx2-5]) {
65 // Elastic recoil and in stuprf npprmr > 0,
66 // the secondary being loaded is actually still the interacting particle
67 cppstack->SetCurrentTrack( TRACKR.ispusr[mkbmx2-4] );
68 // cout << "endraw elastic recoil track=" << TRACKR.ispusr[mkbmx2-1] << " parent=" << TRACKR.ispusr[mkbmx2-4]
72 cppstack->SetCurrentTrack(TRACKR.ispusr[mkbmx2-1] );
73 (TVirtualMCApplication::Instance())->Stepping();
75 // cppstack->SetCurrentTrack( saveTrackId );
78 // For icode 21,22 the particle has fallen below thresshold.
79 // This has to be signalled to the StepManager()
81 cppstack->SetCurrentTrack( TRACKR.ispusr[mkbmx2-1] );
83 fluka->SetIcode((FlukaProcessCode_t) icode);
84 (TVirtualMCApplication::Instance())->Stepping();
85 fluka->SetTrackIsNew(kFALSE);
86 fluka->SetIcode((FlukaProcessCode_t)icode);
88 (TVirtualMCApplication::Instance())->Stepping();
89 // cppstack->SetCurrentTrack( saveTrackId );
93 } // end of extern "C"