position.SetY(TRACKR.ytrack[TRACKR.ntrack]);
position.SetZ(TRACKR.ztrack[TRACKR.ntrack]);
position.SetT(0);
+ } else if (caller == 40) { // mgdraw resuming transport
+ position.SetX(TRACKR.spausr[0]);
+ position.SetY(TRACKR.spausr[1]);
+ position.SetZ(TRACKR.spausr[2]);
+ position.SetT(TRACKR.spausr[3]);
}
else
Warning("TrackPosition","position not available");
y = TRACKR.ytrack[TRACKR.ntrack];
z = TRACKR.ztrack[TRACKR.ntrack];
}
+ else if (caller == 40) { // mgdraw resuming transport
+ x = TRACKR.spausr[0];
+ y = TRACKR.spausr[1];
+ z = TRACKR.spausr[2];
+ }
else
Warning("TrackPosition","position not available");
}
momentum.SetE(TRACKR.etrack);
return;
}
+ } else if (caller == 40) { // mgdraw resuming transport
+ momentum.SetPx(TRACKR.spausr[4]);
+ momentum.SetPy(TRACKR.spausr[5]);
+ momentum.SetPz(TRACKR.spausr[6]);
+ momentum.SetE (TRACKR.spausr[7]);
+ return;
}
else
Warning("TrackMomentum","momentum not available");
e = TRACKR.etrack;
return;
}
+ } else if (caller == 40) { // mgdraw resuming transport
+ px = TRACKR.spausr[4];
+ py = TRACKR.spausr[5];
+ pz = TRACKR.spausr[6];
+ e = TRACKR.spausr[7];
}
else
Warning("TrackMomentum","momentum not available");
// Return the length in centimeters of the current step
// TRACKR.ctrack = total curved path
Int_t caller = GetCaller();
- if (caller == 11 || caller==12 || caller == 3 || caller == 6 || caller == 50) //bxdraw,endraw,usdraw, ckov
+ if (caller == 11 || caller==12 || caller == 3 || caller == 6 || caller == 50 || caller == 40) //bxdraw,endraw,usdraw, ckov
return 0.0;
else if (caller == 4) //mgdraw
return TRACKR.ctrack;
Int_t caller = GetCaller();
if (caller == 11 || caller==12 || caller == 3 || caller == 4 || caller == 6 || caller == 50) //bxdraw,endraw,mgdraw,usdraw,ckov
return TRACKR.cmtrck;
+ else if (caller == 40) // mgdraw resuming transport
+ return TRACKR.spausr[8];
else {
Warning("TrackLength", "track length not available");
return 0.0;
Int_t caller = GetCaller();
if (caller == 11 || caller==12 || caller == 3 || caller == 4 || caller == 6 || caller == 50) //bxdraw,endraw,mgdraw,usdraw,ckov
return TRACKR.atrack;
+ else if (caller == 40)
+ return TRACKR.spausr[3];
else {
Warning("TrackTime", "track time not available");
return 0.0;
// If coming from usdraw we just signal particle production - no edep
// If just first time after resuming, no edep for the primary
Int_t caller = GetCaller();
- if (caller == 11 || caller==12 || caller==6) return 0.0;
+ if (caller == 11 || caller==12 || caller==6 || caller == 40) return 0.0;
Double_t sum = 0;
for ( Int_t j=0;j<TRACKR.mtrack;j++) {
sum +=TRACKR.dtrack[j];
cout << endl << " !!! I am in mgdraw - calling Stepping(): " << icode << endl;
cout << endl << " Track Id = " << trackId << " region = " << mreg << 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;
}
-
+
+ fluka->SetTrackIsNew(kTRUE);
+ fluka->SetCaller(40);
(TVirtualMCApplication::Instance())->Stepping();
- fluka->SetTrackIsNew(kFALSE);
+
+ // 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 << endl << " Track Id = " << trackId << " region = " << mreg << endl;
}
+
+ fluka->SetTrackIsNew(kFALSE);
+ fluka->SetCaller(4);
(TVirtualMCApplication::Instance())->Stepping();
}
#include <Riostream.h>
#include "TVirtualMCApplication.h"
#include "TFluka.h"
+#include <TLorentzVector.h>
#include "Fdimpar.h" //(DIMPAR) fluka include
#include "Ftrackr.h" //(TRACKR) fluka common
#ifndef WIN32
if (fluka->IsTrackDisappeared()) {
TRACKR.ispusr[mkbmx2 - 2] = 1;
+// Save properties at point where particle disappears in case this is only an interruption
+ TLorentzVector p;
+ gMC->TrackMomentum(p);
+
+ TRACKR.spausr[0] = xsco; // x
+ TRACKR.spausr[1] = ysco; // y
+ TRACKR.spausr[2] = zsco; // z
+ TRACKR.spausr[3] = gMC->TrackTime(); // t
+ TRACKR.spausr[4] = p[0]; // px
+ TRACKR.spausr[5] = p[1]; // py
+ TRACKR.spausr[6] = p[2]; // pz
+ TRACKR.spausr[7] = p[3]; // e
+ TRACKR.spausr[8] = gMC->TrackLength(); // Length
}
fluka->SetMreg(mreg);
fluka->SetYsco(ysco);
fluka->SetZsco(zsco);
- if (debug) printf("USDRAW: Number of track segments:%d %d %d\n", TRACKR.ntrack, TRACKR.mtrack, icode);
+ if (debug) printf("USDRAW: Number of track segments:%6d %6d %6d %10.3e\n", TRACKR.ntrack, TRACKR.mtrack, icode, TRACKR.atrack);
(TVirtualMCApplication::Instance())->Stepping();
fluka->SetTrackIsNew(kFALSE);