X-Git-Url: http://git.uio.no/git/?a=blobdiff_plain;f=TFluka%2Fmgdraw.cxx;h=33accf8bf6a0155efe12321d9589a891eb092ba9;hb=f03a3a6e8530b734e09632b1f99dfd4d84a14dd5;hp=f7515e5fc8b5da8cf3ba84fde5839ed0fa170e40;hpb=57dc5a4af2dcb90f018a4c706dc43b5ecc4c61ed;p=u%2Fmrichter%2FAliRoot.git diff --git a/TFluka/mgdraw.cxx b/TFluka/mgdraw.cxx index f7515e5fc8b..33accf8bf6a 100644 --- a/TFluka/mgdraw.cxx +++ b/TFluka/mgdraw.cxx @@ -1,15 +1,22 @@ #include #include "TVirtualMCApplication.h" #include "TVirtualMCStack.h" - #include "TFluka.h" +#include "TFlukaCodes.h" + +// Fluka includes +#include "Fdimpar.h" //(DIMPAR) +#include "Fdblprc.h" //(DBLPRC) +#include "Ftrackr.h" //(TRACKR) +#include "Fopphst.h" //(OPPHST) +#include "Fflkstk.h" //(FLKSTK) +#include "Fltclcm.h" //(LTCLCM) +#include "Fpaprop.h" //(PAPROP) +#include "Falldlt.h" //(ALLDLT) +#include "Fdpdxcm.h" //(DPDXCM) +#include "Fflkmat.h" //(FLKMAT) -// Fluka include -#include "Fdimpar.h" //(DIMPAR) fluka include -#include "Fdblprc.h" //(DBLPRC) fluka common -#include "Ftrackr.h" //(TRACKR) fluka common -#include "Fopphst.h" //(OPPHST) fluka common -#include "Fstack.h" //(STACK) fluka common +#include "TGeoManager.h" #ifndef WIN32 # define mgdraw mgdraw_ @@ -21,7 +28,7 @@ extern "C" { void mgdraw(Int_t& icode, Int_t& mreg) { TFluka* fluka = (TFluka*) gMC; - Int_t verbosityLevel = fluka->GetVerbosityLevel(); + if (mreg == fluka->GetDummyRegion()) return; // // Make sure that stack has currrent track Id // @@ -29,55 +36,134 @@ void mgdraw(Int_t& icode, Int_t& mreg) TVirtualMCStack* cppstack = fluka->GetStack(); if (TRACKR.jtrack == -1) { - trackId = OPPHST.louopp[OPPHST.lstopp]; - if (trackId == 0) { - trackId = STACK.ispark[STACK.lstack][mkbmx2-1]; - } + trackId = OPPHST.louopp[OPPHST.lstopp]; + if (trackId == 0) { + trackId = FLKSTK.ispark[FLKSTK.npflka][mkbmx2-1]; + } } else { - trackId = TRACKR.ispusr[mkbmx2-1]; + trackId = TRACKR.ispusr[mkbmx2-1]; + } + + Int_t verbosityLevel = fluka->GetVerbosityLevel(); + + if (TRACKR.jtrack < -6) { + // from -7 to -12 = "heavy" fragment + // assing parent id + // id < -6 was skipped in stuprf => if (kpart < -6) return; + if (verbosityLevel >= 3) { + cout << "mgdraw: (heavy fragment) jtrack < -6 =" << TRACKR.jtrack + << " assign parent pdg=" << fluka->PDGFromId(TRACKR.ispusr[mkbmx2 - 3]) << endl; + } + TRACKR.jtrack = TRACKR.ispusr[mkbmx2 - 3]; } cppstack->SetCurrentTrack(trackId); // // - fluka->SetMreg(mreg); - fluka->SetNewreg(mreg); - fluka->SetIcode(icode); - fluka->SetCaller(4); + Int_t mlttc = TRACKR.lt1trk; // LTCLCM.mlatm1; + fluka->SetMreg(mreg, mlttc); + fluka->SetIcode((FlukaProcessCode_t) icode); + fluka->SetCaller(kMGDRAW); + + Int_t nodeId; + Int_t volId = fluka->CurrentVolID(nodeId); + Int_t crtlttc = gGeoManager->GetCurrentNodeId()+1; + + // check region lattice consistency (debug Ernesto) + // ***************************************************** + if(verbosityLevel>=3 && mreg != volId && !gGeoManager->IsOutside() ) { + cout << " mgdraw: track=" << trackId << " 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; + } + // ***************************************************** + + + Int_t med = FLKMAT.medium[mreg - 1]; // Medium + Int_t msd = DPDXCM.msdpdx[med - 1]; // Iionisation model if (!TRACKR.ispusr[mkbmx2 - 2]) { - // - // Single step if (verbosityLevel >= 3) { - cout << endl << " !!! I am in mgdraw - calling Stepping(): " << icode << endl; - cout << endl << " Track Id = " << trackId << " region = " << mreg << endl; + cout << endl << "mgdraw: energy deposition for:" << trackId + << " icode=" << icode + << " pdg=" << fluka->PDGFromId(TRACKR.jtrack) + << " flukaid="<< TRACKR.jtrack + << " mreg=" << mreg + << " np =" << ALLDLT.nalldl + << endl; + } - (TVirtualMCApplication::Instance())->Stepping(); - fluka->SetTrackIsNew(kFALSE); - } else { - // - // Tracking is being resumed after secondary tracking - // - // Reset flag - TRACKR.ispusr[mkbmx2 - 2] = 0; -// - fluka->SetTrackIsNew(kTRUE); - if (verbosityLevel >= 3) { - cout << endl << " !!! I am in mgdraw - resuming Stepping(): " << trackId << endl; + if (msd > 0) { +// +// Primary ionsiations + Int_t nprim = ALLDLT.nalldl; +// Protection against nprim > mxalld + if (nprim >= mxalld) { + nprim = mxalld; + Warning("mgdraw", "nprim > mxalld, nprim: %6d pdg: %6d mreg %6d p %13.3f step %13.3f\n", + ALLDLT.nalldl, + fluka->PDGFromId(TRACKR.jtrack), + mreg, + TRACKR.ptrack, + TRACKR.ctrack); + + } +// Multiple steps for nprim > 0 + if (nprim > 0) { + for (Int_t i = 0; i < nprim; i++) { + fluka->SetCurrentPrimaryElectronIndex(i); + (TVirtualMCApplication::Instance())->Stepping(); + if (i == 0) fluka->SetTrackIsNew(kFALSE); + } + } else { + // No primary electron ionisation + // Call Stepping anyway but flag nprim = 0 as index = -2 + fluka->SetCurrentPrimaryElectronIndex(-2); + (TVirtualMCApplication::Instance())->Stepping(); + } + // Reset the index + fluka->SetCurrentPrimaryElectronIndex(-1); + } else { + // Single step + (TVirtualMCApplication::Instance())->Stepping(); + fluka->SetTrackIsNew(kFALSE); } + + } else { + // + // Tracking is being resumed after secondary tracking + // + if (verbosityLevel >= 3) { + cout << endl << "mgdraw: resuming Stepping(): " << trackId << endl; + } - (TVirtualMCApplication::Instance())->Stepping(); - fluka->SetTrackIsNew(kFALSE); + fluka->SetTrackIsNew(kTRUE); + fluka->SetCaller(kMGResumedTrack); + (TVirtualMCApplication::Instance())->Stepping(); - if (verbosityLevel >= 3) { - cout << endl << " !!! I am in mgdraw - first Stepping() after resume: " << icode << endl; - cout << endl << " Track Id = " << trackId << " region = " << mreg << endl; - } - (TVirtualMCApplication::Instance())->Stepping(); + // Reset flag and stored values + TRACKR.ispusr[mkbmx2 - 2] = 0; + for (Int_t i = 0; i < 9; i++) TRACKR.spausr[i] = -1.; + + + if (verbosityLevel >= 3) { + cout << endl << " !!! I am in mgdraw - first Stepping() after resume: " << icode << endl; + cout << " Track= " << trackId << " region = " << mreg << endl; + } + + fluka->SetTrackIsNew(kFALSE); + fluka->SetCaller(kMGDRAW); + if (msd > 0) fluka->SetCurrentPrimaryElectronIndex(-2); + (TVirtualMCApplication::Instance())->Stepping(); + if (msd > 0) fluka->SetCurrentPrimaryElectronIndex(-1); } - - } // end of mgdraw } // end of extern "C"