Public Member Functions | |
Entry (BLCMDzntuple *znt, G4double zpos, BLCoordinateType _coordinateType) | |
void | UserZSteppingAction (const G4Track *track) |
Public Attributes | |
BLCMDzntuple * | zntuple |
BLNTuple * | ntuple |
BLEvaluator * | eval |
BLCoordinateType | coordinateType |
int | nNTuples |
BLCMDzntuple::Entry::Entry | ( | BLCMDzntuple * | znt, | |
G4double | zpos, | |||
BLCoordinateType | _coordinateType | |||
) |
References coordinateType, BLNTuple::create(), eval, BLCMDzntuple::file, BLCMDzntuple::format, ntuple, BLCMDzntuple::require, snprintf, TrackFields, and zntuple.
00213 { 00214 char name[128]; 00215 snprintf(name,sizeof(name),"Z%.0f",floor(zpos+0.5)); 00216 00217 zntuple = znt; 00218 ntuple = BLNTuple::create(zntuple->format,"NTuple",name, 00219 TrackFields,zntuple->file); 00220 00221 eval = 0; 00222 if(zntuple->require != "") eval = new BLEvaluator(); 00223 coordinateType = _coordinateType; 00224 }
void BLCMDzntuple::Entry::UserZSteppingAction | ( | const G4Track * | track | ) | [virtual] |
Implements BLManager::ZSteppingAction.
References BLNTuple::appendRow(), B, BEAM, BLCOORD_REFERENCE, coordinateType, BLNTuple::doCallbacks(), E, eval, BLEvaluator::evaluate(), BLCoordinates::getCoords(), BLManager::getExternalParentID(), BLManager::getExternalTrackID(), BLGlobalField::GetFieldValue(), BLNTuple::getNData(), BLGlobalField::getObject(), BLManager::getObject(), BLCoordinates::getRotation(), BLManager::getState(), BLEvaluator::isOK(), BLCoordinates::isValid(), BLCMDzntuple::noSingles, NTrackFields, ntuple, BLCommand::printError(), BLCMDzntuple::require, BLEvaluator::setTrackVariables(), and zntuple.
00227 { 00228 // only use reference coordinates when they are valid 00229 BLManagerState state = BLManager::getObject()->getState(); 00230 if(coordinateType == BLCOORD_REFERENCE && state != BEAM) return; 00231 00232 if(eval) { 00233 eval->setTrackVariables(track,coordinateType); 00234 G4double v = eval->evaluate(zntuple->require); 00235 if(!eval->isOK()) { 00236 BLCommand::printError("beamlossntuple: invalid expression require='%s'\n", 00237 zntuple->require.c_str()); 00238 delete eval; 00239 eval = 0; 00240 v = 1.0; 00241 } 00242 if(v == 0.0) return; 00243 } 00244 00245 G4RunManager* runmgr = G4RunManager::GetRunManager(); 00246 const G4Event* event = runmgr->GetCurrentEvent(); 00247 int evId = event->GetEventID(); 00248 G4ThreeVector position = track->GetPosition(); 00249 G4double time = track->GetGlobalTime(); 00250 G4ThreeVector momentum = track->GetMomentum(); 00251 00252 // get # data fields, and get B and E if needed 00253 unsigned ndata = (ntuple ? ntuple->getNData() : NTrackFields); 00254 G4double field[6]; 00255 if(ndata > NTrackFields) { 00256 G4double point[4]; 00257 point[0] = position[0]; 00258 point[1] = position[1]; 00259 point[2] = position[2]; 00260 point[3] = time; 00261 BLGlobalField::getObject()->GetFieldValue(point,field); 00262 } 00263 00264 // transform to desired coordinates, if available 00265 BLCoordinates *c = (BLCoordinates *)track->GetUserInformation(); 00266 if(c && c->isValid()) { 00267 c->getCoords(coordinateType,position); 00268 momentum = c->getRotation() * momentum; 00269 } 00270 00271 00272 float data[18]; 00273 assert(ndata <= sizeof(data)/sizeof(data[0])); 00274 data[0] = position[0]/mm; // x (mm) 00275 data[1] = position[1]/mm; // y (mm) 00276 data[2] = position[2]/mm; // z (mm) 00277 data[3] = momentum[0]/MeV; // Px (MeV/c) 00278 data[4] = momentum[1]/MeV; // Py (MeV/c) 00279 data[5] = momentum[2]/MeV; // Pz (MeV/c) 00280 data[6] = time/ns; // t (ns) 00281 data[7] = track->GetDefinition()->GetPDGEncoding(); 00282 data[8] = evId; // Event ID 00283 data[9] = BLManager::getObject()->getExternalTrackID(track); 00284 data[10] = BLManager::getObject()->getExternalParentID(track); 00285 data[11] = track->GetWeight(); // Weight 00286 if(ndata > NTrackFields) { 00287 G4ThreeVector B(field[0],field[1],field[2]); 00288 G4ThreeVector E(field[3],field[4],field[5]); 00289 if(c && c->isValid()) { 00290 B = c->getRotation() * B; 00291 E = c->getRotation() * E; 00292 } 00293 data[12] = B[0]/tesla; 00294 data[13] = B[1]/tesla; 00295 data[14] = B[2]/tesla; 00296 data[15] = E[0]/(megavolt/meter); 00297 data[16] = E[1]/(megavolt/meter); 00298 data[17] = E[2]/(megavolt/meter); 00299 } 00300 if(zntuple->noSingles) 00301 ntuple->doCallbacks(data,ndata); 00302 else 00303 ntuple->appendRow(data,ndata); 00304 }
Referenced by Entry(), and UserZSteppingAction().
Referenced by BLCMDzntuple::callback(), Entry(), and UserZSteppingAction().
Referenced by Entry(), and UserZSteppingAction().
Referenced by Entry(), and UserZSteppingAction().