X-Git-Url: http://git.uio.no/git/?a=blobdiff_plain;f=TFluka%2Fendraw.cxx;h=593c1229b9e2edf96374cdd6d37cd752b4f67994;hb=2afc544cd98950134279019a08d8ddf6ca74b7a0;hp=0213740711e8763d0f5d3cb1e0f0a55cd0196919;hpb=fa3d1cc75b38f4b4e3564dd43297764826fdb92c;p=u%2Fmrichter%2FAliRoot.git diff --git a/TFluka/endraw.cxx b/TFluka/endraw.cxx index 0213740711e..593c1229b9e 100644 --- a/TFluka/endraw.cxx +++ b/TFluka/endraw.cxx @@ -1,6 +1,18 @@ #include -#include "AliRun.h" +#include "TVirtualMCApplication.h" +#include "TGeoMaterial.h" +#include "TGeoManager.h" +#include +#include "TFlukaCerenkov.h" + #include "TFluka.h" +#include "TFlukaCodes.h" + +#include "Fdimpar.h" //(DIMPAR) fluka include +#include "Ftrackr.h" //(TRACKR) fluka common +#include "Fltclcm.h" //(LTCLCM) fluka common +#include "Fpaprop.h" //(PAPROP) fluka common + #ifndef WIN32 # define endraw endraw_ #else @@ -9,15 +21,90 @@ extern "C" { void endraw(Int_t& icode, Int_t& mreg, Double_t& rull, Double_t& xsco, Double_t& ysco, Double_t& zsco) { - ((TFluka*) gMC)->SetIcode(icode); - ((TFluka*) gMC)->SetMreg(mreg); - ((TFluka*) gMC)->SetRull(rull); - ((TFluka*) gMC)->SetXsco(xsco); - ((TFluka*) gMC)->SetYsco(ysco); - ((TFluka*) gMC)->SetZsco(zsco); - cout << endl << " !!! I am in endraw - calling gAlice->Stepping()" << endl; - ((TFluka*) gMC)->FutoTest(); -// gAlice->Stepping(); + TFluka* fluka = (TFluka*) gMC; + // nothing to do if particle in dummy region + if (mreg == fluka->GetDummyRegion()) return; + Int_t verbosityLevel = fluka->GetVerbosityLevel(); + Bool_t debug = (verbosityLevel >= 3)? kTRUE : kFALSE; + Int_t mlttc = (icode==kKASKADinelarecoil) ? TRACKR.lt2trk : TRACKR.lt1trk; //LTCLCM.mlatm1; + fluka->SetCaller(kENDRAW); + fluka->SetRull(rull); + fluka->SetXsco(xsco); + fluka->SetYsco(ysco); + fluka->SetZsco(zsco); + fluka->SetMreg(mreg, mlttc); + + Float_t edep = rull; + + if (TRACKR.jtrack == -1) { + // Handle quantum efficiency the G3 way + if (debug) printf("endraw: Cerenkov photon depositing energy: %d %e\n", mreg, rull); + TGeoMaterial* material = (gGeoManager->GetCurrentVolume())->GetMaterial(); + TFlukaCerenkov* cerenkov = dynamic_cast (material->GetCerenkovProperties()); + if (cerenkov) { + Double_t eff = (cerenkov->GetQuantumEfficiency(rull)); + if (gRandom->Rndm() > eff) { + edep = 0.; + } + } + } + + TVirtualMCStack* cppstack = fluka->GetStack(); + + if (debug) { + cout << "ENDRAW For icode=" << icode + << " track=" << TRACKR.ispusr[mkbmx2-1] << " pdg=" << fluka->PDGFromId(TRACKR.jtrack) + << " edep="<< edep << " mreg=" << mreg << endl; + } + + // check region lattice consistency (debug Ernesto) + // ***************************************************** + Int_t nodeId; + Int_t volId = fluka->CurrentVolID(nodeId); + Int_t crtlttc = gGeoManager->GetCurrentNodeId()+1; + if( mreg != volId && !gGeoManager->IsOutside() ) { + cout << " endraw: track=" << TRACKR.ispusr[mkbmx2-1] << " pdg=" << fluka->PDGFromId(TRACKR.jtrack) + << " icode=" << icode << " gNstep=" << fluka->GetNstep() << endl + << " fluka mreg=" << mreg << " mlttc=" << mlttc << endl + << " TGeo volId=" << volId << " crtlttc=" << crtlttc << endl + << " common TRACKR lt1trk=" << TRACKR.lt1trk << " lt2trk=" << TRACKR.lt2trk << endl + << " common LTCLCM newlat=" << LTCLCM.newlat << " mlatld=" << LTCLCM.mlatld << endl + << " mlatm1=" << LTCLCM.mlatm1 << " mltsen=" << LTCLCM.mltsen << endl + << " mltsm1=" << LTCLCM.mltsm1 << " mlattc=" << LTCLCM.mlattc << endl; + if( mlttc == crtlttc ) cout << " *************************************************************" << endl; + } + // ***************************************************** + + + if (icode != kEMFSCOstopping1 && icode != kEMFSCOstopping2) { + fluka->SetIcode((FlukaProcessCode_t)icode); + fluka->SetRull(edep); + if (icode == kKASKADelarecoil && TRACKR.ispusr[mkbmx2-5]) { + // Elastic recoil and in stuprf npprmr > 0, + // the secondary being loaded is actually still the interacting particle + cppstack->SetCurrentTrack( TRACKR.ispusr[mkbmx2-4] ); + // cout << "endraw elastic recoil track=" << TRACKR.ispusr[mkbmx2-1] << " parent=" << TRACKR.ispusr[mkbmx2-4] + // << endl; + } + else + cppstack->SetCurrentTrack(TRACKR.ispusr[mkbmx2-1] ); + (TVirtualMCApplication::Instance())->Stepping(); + } else { + // + // For icode 21,22 the particle has fallen below thresshold. + // This has to be signalled to the StepManager() + // + cppstack->SetCurrentTrack( TRACKR.ispusr[mkbmx2-1] ); + fluka->SetRull(edep); + fluka->SetIcode((FlukaProcessCode_t) icode); + (TVirtualMCApplication::Instance())->Stepping(); + fluka->SetTrackIsNew(kFALSE); + fluka->SetIcode((FlukaProcessCode_t)icode); + fluka->SetRull(0.); + (TVirtualMCApplication::Instance())->Stepping(); +// cppstack->SetCurrentTrack( saveTrackId ); + + } } // end of endraw } // end of extern "C"