]>
Commit | Line | Data |
---|---|---|
1 | #include <Riostream.h> | |
2 | #include "TVirtualMCApplication.h" | |
3 | #include "TGeoMaterial.h" | |
4 | #include "TGeoManager.h" | |
5 | #include <TParticle.h> | |
6 | #include "TFlukaCerenkov.h" | |
7 | ||
8 | #include "TFluka.h" | |
9 | #include "TFlukaCodes.h" | |
10 | ||
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 | |
15 | ||
16 | #ifndef WIN32 | |
17 | # define endraw endraw_ | |
18 | #else | |
19 | # define endraw ENDRAW | |
20 | #endif | |
21 | extern "C" { | |
22 | void endraw(Int_t& icode, Int_t& mreg, Double_t& rull, Double_t& xsco, Double_t& ysco, Double_t& zsco) | |
23 | { | |
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 = (icode==kKASKADinelarecoil) ? TRACKR.lt2trk : TRACKR.lt1trk; //LTCLCM.mlatm1; | |
30 | fluka->SetCaller(kENDRAW); | |
31 | fluka->SetRull(rull); | |
32 | fluka->SetXsco(xsco); | |
33 | fluka->SetYsco(ysco); | |
34 | fluka->SetZsco(zsco); | |
35 | fluka->SetMreg(mreg, mlttc); | |
36 | ||
37 | Float_t edep = rull; | |
38 | ||
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()); | |
44 | if (cerenkov) { | |
45 | Double_t eff = (cerenkov->GetQuantumEfficiency(rull)); | |
46 | if (gRandom->Rndm() > eff) { | |
47 | edep = 0.; | |
48 | } | |
49 | } | |
50 | } | |
51 | ||
52 | TVirtualMCStack* cppstack = fluka->GetStack(); | |
53 | ||
54 | if (debug) { | |
55 | cout << "ENDRAW For icode=" << icode | |
56 | << " track=" << TRACKR.ispusr[mkbmx2-1] << " pdg=" << fluka->PDGFromId(TRACKR.jtrack) | |
57 | << " edep="<< edep << " mreg=" << mreg << endl; | |
58 | } | |
59 | ||
60 | // check region lattice consistency (debug Ernesto) | |
61 | // ***************************************************** | |
62 | Int_t nodeId; | |
63 | Int_t volId = fluka->CurrentVolID(nodeId); | |
64 | Int_t crtlttc = gGeoManager->GetCurrentNodeId()+1; | |
65 | if(debug && mreg != volId && !gGeoManager->IsOutside() ) { | |
66 | cout << " endraw: track=" << TRACKR.ispusr[mkbmx2-1] << " pdg=" << fluka->PDGFromId(TRACKR.jtrack) | |
67 | << " icode=" << icode << " gNstep=" << fluka->GetNstep() << endl | |
68 | << " fluka mreg=" << mreg << " mlttc=" << mlttc << endl | |
69 | << " TGeo volId=" << volId << " crtlttc=" << crtlttc << endl | |
70 | << " common TRACKR lt1trk=" << TRACKR.lt1trk << " lt2trk=" << TRACKR.lt2trk << endl | |
71 | << " common LTCLCM newlat=" << LTCLCM.newlat << " mlatld=" << LTCLCM.mlatld << endl | |
72 | << " mlatm1=" << LTCLCM.mlatm1 << " mltsen=" << LTCLCM.mltsen << endl | |
73 | << " mltsm1=" << LTCLCM.mltsm1 << " mlattc=" << LTCLCM.mlattc << endl; | |
74 | if( mlttc == crtlttc ) cout << " *************************************************************" << endl; | |
75 | } | |
76 | // ***************************************************** | |
77 | ||
78 | ||
79 | if (icode != kEMFSCOstopping1 && icode != kEMFSCOstopping2) { | |
80 | fluka->SetIcode((FlukaProcessCode_t)icode); | |
81 | fluka->SetRull(edep); | |
82 | if (icode == kKASKADelarecoil && TRACKR.ispusr[mkbmx2-5]) { | |
83 | // Elastic recoil and in stuprf npprmr > 0, | |
84 | // the secondary being loaded is actually still the interacting particle | |
85 | cppstack->SetCurrentTrack( TRACKR.ispusr[mkbmx2-4] ); | |
86 | // cout << "endraw elastic recoil track=" << TRACKR.ispusr[mkbmx2-1] << " parent=" << TRACKR.ispusr[mkbmx2-4] | |
87 | // << endl; | |
88 | } | |
89 | else | |
90 | cppstack->SetCurrentTrack(TRACKR.ispusr[mkbmx2-1] ); | |
91 | (TVirtualMCApplication::Instance())->Stepping(); | |
92 | } else { | |
93 | // | |
94 | // For icode 21,22 the particle has fallen below thresshold. | |
95 | // This has to be signalled to the StepManager() | |
96 | // | |
97 | cppstack->SetCurrentTrack( TRACKR.ispusr[mkbmx2-1] ); | |
98 | fluka->SetRull(edep); | |
99 | fluka->SetIcode((FlukaProcessCode_t) icode); | |
100 | (TVirtualMCApplication::Instance())->Stepping(); | |
101 | fluka->SetTrackIsNew(kFALSE); | |
102 | fluka->SetIcode((FlukaProcessCode_t)icode); | |
103 | fluka->SetRull(0.); | |
104 | (TVirtualMCApplication::Instance())->Stepping(); | |
105 | // cppstack->SetCurrentTrack( saveTrackId ); | |
106 | ||
107 | } | |
108 | } // end of endraw | |
109 | } // end of extern "C" | |
110 |