]>
Commit | Line | Data |
---|---|---|
fa3d1cc7 | 1 | #include <Riostream.h> |
8fd1d27e | 2 | #include "TVirtualMCApplication.h" |
df14e7fb | 3 | #include "TGeoMaterial.h" |
4 | #include "TGeoManager.h" | |
18e0cabb | 5 | #include <TParticle.h> |
df14e7fb | 6 | #include "TFlukaCerenkov.h" |
a7bb59a2 | 7 | |
fa3d1cc7 | 8 | #include "TFluka.h" |
d566901f | 9 | #include "TFlukaCodes.h" |
a7bb59a2 | 10 | |
7dac99f1 | 11 | #include "Fdimpar.h" //(DIMPAR) fluka include |
12 | #include "Ftrackr.h" //(TRACKR) fluka common | |
d566901f | 13 | #include "Fltclcm.h" //(LTCLCM) fluka common |
14 | #include "Fpaprop.h" //(PAPROP) fluka common | |
87ad3c3e | 15 | #include "Fopphst.h" //(OPPHST) fluka common |
18e0cabb | 16 | |
fa3d1cc7 | 17 | #ifndef WIN32 |
18 | # define endraw endraw_ | |
19 | #else | |
20 | # define endraw ENDRAW | |
21 | #endif | |
22 | extern "C" { | |
23 | void endraw(Int_t& icode, Int_t& mreg, Double_t& rull, Double_t& xsco, Double_t& ysco, Double_t& zsco) | |
24 | { | |
4b81a588 | 25 | TFluka* fluka = (TFluka*) gMC; |
d566901f | 26 | // nothing to do if particle in dummy region |
27 | if (mreg == fluka->GetDummyRegion()) return; | |
2bc4c610 | 28 | Int_t verbosityLevel = fluka->GetVerbosityLevel(); |
2bc78182 | 29 | Bool_t debug = (verbosityLevel >= 3)? kTRUE : kFALSE; |
4aba9d66 | 30 | Int_t mlttc = (icode==kKASKADinelarecoil) ? TRACKR.lt2trk : TRACKR.lt1trk; //LTCLCM.mlatm1; |
d566901f | 31 | fluka->SetCaller(kENDRAW); |
4b81a588 | 32 | fluka->SetRull(rull); |
33 | fluka->SetXsco(xsco); | |
34 | fluka->SetYsco(ysco); | |
35 | fluka->SetZsco(zsco); | |
d566901f | 36 | fluka->SetMreg(mreg, mlttc); |
4aba9d66 | 37 | |
022d4275 | 38 | Float_t edep = rull; |
69e406a7 | 39 | Int_t ipt = fluka->PDGFromId(TRACKR.jtrack); |
40 | if (ipt == -1) { | |
41 | if (debug) printf("Unknown particle %5d %5d \n", TRACKR.jtrack, icode); | |
42 | return; | |
43 | } | |
44 | ||
df14e7fb | 45 | if (TRACKR.jtrack == -1) { |
18e0cabb | 46 | // Handle quantum efficiency the G3 way |
2bc4c610 | 47 | if (debug) printf("endraw: Cerenkov photon depositing energy: %d %e\n", mreg, rull); |
df14e7fb | 48 | TGeoMaterial* material = (gGeoManager->GetCurrentVolume())->GetMaterial(); |
df14e7fb | 49 | TFlukaCerenkov* cerenkov = dynamic_cast<TFlukaCerenkov*> (material->GetCerenkovProperties()); |
50 | if (cerenkov) { | |
18e0cabb | 51 | Double_t eff = (cerenkov->GetQuantumEfficiency(rull)); |
52 | if (gRandom->Rndm() > eff) { | |
53 | edep = 0.; | |
54 | } | |
df14e7fb | 55 | } |
56 | } | |
2bc78182 | 57 | |
18e0cabb | 58 | TVirtualMCStack* cppstack = fluka->GetStack(); |
18e0cabb | 59 | |
60 | if (debug) { | |
4aba9d66 | 61 | cout << "ENDRAW For icode=" << icode |
18e0cabb | 62 | << " track=" << TRACKR.ispusr[mkbmx2-1] << " pdg=" << fluka->PDGFromId(TRACKR.jtrack) |
4aba9d66 | 63 | << " edep="<< edep << " mreg=" << mreg << endl; |
18e0cabb | 64 | } |
65 | ||
4aba9d66 | 66 | // check region lattice consistency (debug Ernesto) |
67 | // ***************************************************** | |
68 | Int_t nodeId; | |
69 | Int_t volId = fluka->CurrentVolID(nodeId); | |
70 | Int_t crtlttc = gGeoManager->GetCurrentNodeId()+1; | |
4b1c3976 | 71 | if(debug && mreg != volId && !gGeoManager->IsOutside() ) { |
4aba9d66 | 72 | cout << " endraw: track=" << TRACKR.ispusr[mkbmx2-1] << " pdg=" << fluka->PDGFromId(TRACKR.jtrack) |
73 | << " icode=" << icode << " gNstep=" << fluka->GetNstep() << endl | |
74 | << " fluka mreg=" << mreg << " mlttc=" << mlttc << endl | |
75 | << " TGeo volId=" << volId << " crtlttc=" << crtlttc << endl | |
76 | << " common TRACKR lt1trk=" << TRACKR.lt1trk << " lt2trk=" << TRACKR.lt2trk << endl | |
77 | << " common LTCLCM newlat=" << LTCLCM.newlat << " mlatld=" << LTCLCM.mlatld << endl | |
78 | << " mlatm1=" << LTCLCM.mlatm1 << " mltsen=" << LTCLCM.mltsen << endl | |
79 | << " mltsm1=" << LTCLCM.mltsm1 << " mlattc=" << LTCLCM.mlattc << endl; | |
80 | if( mlttc == crtlttc ) cout << " *************************************************************" << endl; | |
81 | } | |
82 | // ***************************************************** | |
d566901f | 83 | if (icode != kEMFSCOstopping1 && icode != kEMFSCOstopping2) { |
84 | fluka->SetIcode((FlukaProcessCode_t)icode); | |
022d4275 | 85 | fluka->SetRull(edep); |
18e0cabb | 86 | if (icode == kKASKADelarecoil && TRACKR.ispusr[mkbmx2-5]) { |
69e406a7 | 87 | // Elastic recoil and in stuprf npprmr > 0, |
88 | // the secondary being loaded is actually still the interacting particle | |
89 | cppstack->SetCurrentTrack( TRACKR.ispusr[mkbmx2-4] ); | |
87ad3c3e | 90 | } else if (TRACKR.jtrack == -1) { |
91 | cppstack->SetCurrentTrack(OPPHST.louopp[OPPHST.lstopp]); | |
69e406a7 | 92 | } else { |
4aba9d66 | 93 | cppstack->SetCurrentTrack(TRACKR.ispusr[mkbmx2-1] ); |
69e406a7 | 94 | } |
95 | ||
95bb1461 | 96 | (TVirtualMCApplication::Instance())->Stepping(); |
69e406a7 | 97 | |
022d4275 | 98 | } else { |
2bc78182 | 99 | // |
d566901f | 100 | // For icode 21,22 the particle has fallen below thresshold. |
2bc78182 | 101 | // This has to be signalled to the StepManager() |
102 | // | |
18e0cabb | 103 | cppstack->SetCurrentTrack( TRACKR.ispusr[mkbmx2-1] ); |
87ad3c3e | 104 | |
a5b73d69 | 105 | fluka->SetRull(edep); |
d566901f | 106 | fluka->SetIcode((FlukaProcessCode_t) icode); |
022d4275 | 107 | (TVirtualMCApplication::Instance())->Stepping(); |
108 | fluka->SetTrackIsNew(kFALSE); | |
0375c7c5 | 109 | // fluka->SetIcode((FlukaProcessCode_t)icode); |
110 | // fluka->SetRull(0.); | |
111 | // (TVirtualMCApplication::Instance())->Stepping(); | |
022d4275 | 112 | } |
fa3d1cc7 | 113 | } // end of endraw |
114 | } // end of extern "C" | |
115 |