Dear experts
I tried to simulate particle passing drift chamber, using AvalancheMC::AvalancheElectrons()
.
Part of my codes are:
//Setup GeometrySimple(box with gas) and AnalyticField(wires) and sensor...
void simXT::MakeTrack(int nTrack){
clock_t tStart = clock();
TrackHeed* track = new TrackHeed(); //Heed++ model
AvalancheMC* drift = new AvalancheMC(); //Change model here to use MC or microscopic
ViewCell* cellView = new ViewCell();
ViewDrift* draw_drift = new ViewDrift();
track->SetSensor(fSensor_e);
track->SetParticle(fPrimaryParticle);
track->SetMomentum(fPrimaryMomentum);
track->EnableDeltaElectronTransport(); //Enable Secondary ionization
std::cout<<track->GetEnergy()<<std::endl;
//Enable field to calculate track trajectory
double maxrange = 0.;
double rforstraight = 0.;
double stepstraight = 0.;
double stepcurved = 0.;
track->EnableElectricField();
track->EnableMagneticField();
track->GetSteppingLimits(maxrange, rforstraight, stepstraight, stepcurved);
std::cout<<maxrange<<" "<<rforstraight<<" "<<stepstraight<<" "<<stepcurved<<std::endl;
stepcurved = 0.02;
track->SetSteppingLimits(maxrange, rforstraight, stepstraight, stepcurved);
drift->SetSensor(fSensor_e);
drift->EnableSignalCalculation();
//loop over tracks
for(int i=0; i<nTrack; i++){
//define track starting point and direction
double track_x = gRandom->Uniform(-1., 1.);
double track_y = 1.;
double track_z = 0.;
double track_t = 0.;
double track_dx = gRandom->Uniform(-1., 1.);
double track_dy = -1.;
double track_dz = gRandom->Uniform(-1., 1.);
//Initialize signal
fSensor_e->ClearSignal();
//Make new track
track->NewTrack(track_x, track_y, track_z, track_t, track_dx, track_dy, track_dz);
while(track->GetCluster(xc, yc, zc, tc, nc, ec, extra)){ // Why not use references but normal variables?
if(yc<-1.||yc>1.) continue; //Only use clusters in up/down edge of center cell
double del_x, del_y, del_z, del_t;
double ke;
int i_dummy;
double dummy;
//loop over electrons in one cluster
for(int j=0; j<nc; j++){
track->GetElectron(j, del_x, del_y, del_z, del_t, ke, dummy, dummy, dummy);
if(del_y<-1.||del_y>1.) continue; //avoid large cluster that electron exceed up/down edge of cell
drift->AvalancheElectron(del_x, del_y, del_z, del_t);
size_t ne = drift->GetNumberOfElectronEndpoints();
if(ne == 0) continue; //Situation that electron of cluster is inside field wire
}
}
}
But I got lots of messages like
AvalancheMC::DriftLine: (0.000370, 0.001194, -0.251615) is not in a valid drift region.
I noticed the position of these electrons are inside the anode wire where I set the wire at (0,0) with radius of 0.00125 mm. Are these electrons caused by previous ones flying into anode wire? I’m not sure if this is normal, if it’s not do I need to add a SolidWire to avoid this (assume SolidWire can fix this…)?