예제 #1
0
void SteppingAction::UserSteppingAction(const G4Step* step)
{
	
	G4bool skipStepping = false; //set true if only SD is needed
	if ( skipStepping )return;

    G4Track* track = step->GetTrack();	
    G4String postVol    = "NIL";
    G4String preVol     = "NIL";
    G4String partName   = "NIL";
    G4int    pdgCode    = -999;
    G4String proc       = "NIL";
    G4double time       = -1;
    G4String postProc   = "NIL";
    G4String preProc    = "NIL";
    G4String trackProc  = "NIL";
    G4String trkNextVol = "NIL";
	G4double preKE = 0;


	if(step->GetPostStepPoint()->GetPhysicalVolume())
		postVol  = step->GetPostStepPoint()->GetPhysicalVolume()->GetName(); 
        //step->GetPostStepPoint()->GetTouchableHandle()->GetVolume()->GetName();

	if(step->GetPreStepPoint()->GetPhysicalVolume())
		preVol  =  step->GetPreStepPoint()->GetPhysicalVolume()->GetName(); 

    if(track->GetDynamicParticle()->GetDefinition()) // GetParticleDefinition
    {
        partName = track->GetDynamicParticle()->GetDefinition()->GetParticleName();
    }
    if(step->GetPreStepPoint())
    {
        preKE = step->GetPreStepPoint()->GetKineticEnergy();
    }

	G4bool skipVolume = true;

	if(skipVolume)
	{
        if(!(postVol=="SNSDetectorCsI"|| postVol=="DetPolyShield"|| postVol=="DetLeadShield" 
            ||preVol=="SNSDetectorCsI"|| preVol=="DetPolyShield"|| preVol=="DetLeadShield"
            )) return;
        if( postVol != "SNSDetectorCsI" && partName !="neutron" )   return;
        //skip if not neutron in other volumes
    }

    if(step->GetTotalEnergyDeposit()<0.1*keV && partName !="neutron") return;  


    G4bool skipParticles = true; // all particles ?
    if(skipParticles && step->GetTrack()->GetDynamicParticle()->GetDefinition())
    {
        if( partName == "nu_e"|| partName =="nu_mu"|| partName == "anti_nu_mu" 
            ||partName == "anti_nu_e" || partName == "mu+" || partName =="pi+" 
            || partName =="pi-") // skipped previously e- e+, gamma
                return;
    }

    Analysis* man = Analysis::GetInstance();
    G4StepPoint* pre  = step->GetPreStepPoint();



    if(step->GetPostStepPoint()->GetProcessDefinedStep())
        proc =  step->GetPostStepPoint()->GetProcessDefinedStep()->GetProcessName();

    if(step->GetPostStepPoint())
		time = track->GetGlobalTime(); //step->GetPostStepPoint()->GetGlobalTime();//
    if(track->GetDynamicParticle()->GetDefinition()) // GetParticleDefinition
    {
        pdgCode  = track->GetDynamicParticle()->GetDefinition()->GetPDGEncoding();
    }

    if( step->GetPostStepPoint()->GetProcessDefinedStep())
        postProc = step->GetPostStepPoint()->GetProcessDefinedStep()->GetProcessName();

    if( step->GetPreStepPoint()->GetProcessDefinedStep())
        preProc = step->GetPreStepPoint()->GetProcessDefinedStep()->GetProcessName();

    if(track->GetCreatorProcess())
        trackProc =  track->GetCreatorProcess()->GetProcessName();

	G4double kCarTolerance = G4GeometryTolerance::GetInstance()->GetSurfaceTolerance();  

	
	//############################################
	//In SNS Detector
 
	G4bool snsDetectorCsI = true;  // detector
	G4bool verbDetCsIInfo = false; 	//text output
    G4int volumeID = -1;    
	if( snsDetectorCsI && (postVol=="SNSDetectorCsI" 
	|| postVol=="DetPolyShield" || postVol=="DetLeadShield") )// && partName == "neutron"))
	{
		//if(	!(partName == "gamma"|| partName == "e-"))
		//{
			G4double trackKE = track->GetKineticEnergy();
			G4int stepNum   = track->GetCurrentStepNumber();
            G4int evtid     = G4RunManager::GetRunManager()->GetCurrentEvent()->GetEventID();
            G4int trackid   = track->GetTrackID();
			G4int parentID  = track->GetParentID();

			G4double xx = track->GetPosition().x(); //trackpos= postpos
			G4double yy = track->GetPosition().y();
			G4double zz = track->GetPosition().z();
			G4double postX = step->GetPostStepPoint()->GetPosition().x();
			G4double postY = step->GetPostStepPoint()->GetPosition().y();				
			G4double postZ = step->GetPostStepPoint()->GetPosition().z();
			G4double weight = track->GetWeight() ;//step->GetPreStepPoint()->GetWeight();
			G4double eDep =0;
			
            if(partName == "neutron")// && step->GetPostStepPoint()->GetStepStatus()==fGeomBoundary ) 
            {//fGeomBoundary =1, from G4StepStatus.hh.  use poststep, not pre

                if(postVol=="SNSDetectorCsI" && preVol != "SNSDetectorCsI" ) volumeID = 1;
                else if( postVol == "DetLeadShield" &&  !(preVol == "SNSDetectorCsI" 
                        || preVol == "DetLeadShield"))  volumeID = 2;
                else if( postVol == "DetPolyShield"&&  !(preVol == "SNSDetectorCsI" 
                        || preVol == "DetPolyShield" || preVol == "DetLeadShield"))volumeID = 3;
                //else if( postVol == "DetWaterShield"&&  !(preVol == "SNSDetectorCsI" 
                //   || preVol == "DetLeadShield" ||preVol == "DetPolyShield" ))volumeID = 4;    
                //else if( preVol == "MonolithSteelCyl")volumeID = 5;//NOTE
                //xx = (aTrack->GetVertexPosition()).x();
                //yy = (aTrack->GetVertexPosition()).y();
                //zz = (aTrack->GetVertexPosition()).z();
				
				G4double preX = step->GetPreStepPoint()->GetPosition().x();
				G4double preY = step->GetPreStepPoint()->GetPosition().y();				
				G4double preZ = step->GetPreStepPoint()->GetPosition().z();
				//pass without interaction
                if(step->GetPostStepPoint()->GetStepStatus()==fGeomBoundary &&  
                    preVol == "DetLeadShield" && postVol == "DetLeadShield")
                {   
                    volumeID = 1;
                    G4cout  << " Passed vol1 ...... " << G4endl;
                }

                if(track->GetNextVolume() == 0) volumeID = 0;

                if(volumeID > -1)
					man->FillSNSneutronFlux(volumeID, preKE/MeV , trackKE/MeV, pdgCode, weight, xx/m,  
                    yy/m, zz/m, evtid, trackid, parentID, stepNum, time/microsecond); 
                

				if(verbDetCsIInfo && volumeID > -1)
				{
                    G4cout  << " NFLUX "
					<< std::setprecision(3) << preKE/MeV 
					<< " preKE(mev):postKE " << std::setprecision(3) << trackKE/MeV    
                    << " " << partName << " eDep "
                    << std::setprecision(3) << eDep/MeV <<  " mev|pre:post " <<  preVol 
                    <<  " " << postVol << " volID "<< volumeID << " " << weight 
                    << " wt|evt:track:step " << evtid << " "<< trackid << " " << stepNum
                    << "  " << preProc << " preproc|postproc " << postProc << " "
                    << track->GetCreatorProcess()->GetProcessName()
                    <<  " create_proc|in " << track->GetLogicalVolumeAtVertex()->GetName()
					<< "  withKE "<< track->GetVertexKineticEnergy()/MeV
                    //<< " track_xyz_m " << std::setprecision(3) << xx/m << " " << std::setprecision(3) 
                    //<< yy/m << " " << std::setprecision(3) <<  zz/m
                    << " post_xyz_m " << std::setprecision(3) << postX/m << " " << std::setprecision(3) 
					<< postY/m << " " << std::setprecision(3) << postZ/m
					<< " pre_xyz_m " << std::setprecision(3) << preX/m << " " << std::setprecision(3) 
					<< preY/m << " " << std::setprecision(3) << preZ/m
                    << " postStatus " << step->GetPostStepPoint()->GetStepStatus()
                    << G4endl;
				}
			
				G4bool shieldSteps = false;
                if( shieldSteps && (postVol== "DetPolyShield"|| postVol=="DetLeadShield" ||
					postVol=="SNSDetectorCsI" ) &&  postVol != preVol ) 
                {
                    G4cout  << " ShieldN "
                    << std::setprecision(3) << preKE/MeV 
                    << " preKE(mev):postKE " << std::setprecision(3) << trackKE/MeV    
                    << " " << partName << " eDep "
                    << std::setprecision(3) << eDep/MeV <<  " mev|pre:post " <<  preVol 
                    <<  " " << postVol << " volID "<< volumeID << " " << weight 
                    << " wt|evt:track:step " << evtid << " "<< trackid << " " << stepNum
                    << "  " << preProc << " preproc|postproc " << postProc
                    << "  " << track->GetCreatorProcess()->GetProcessName()
                    <<  " create_proc|in " << track->GetLogicalVolumeAtVertex()->GetName()
                    << "  withKE "<< track->GetVertexKineticEnergy()/MeV
                    << " xyz_m " << std::setprecision(3) << postX/m << " " << std::setprecision(3) 
                    << postY/m << " " << std::setprecision(3) << postZ/m
                    << " postStatus " << step->GetPostStepPoint()->GetStepStatus()
                    << G4endl;
                }	
            }//nuetron nFlux vol


            //Detections
			eDep = step->GetTotalEnergyDeposit();	
			if(postVol=="SNSDetectorCsI")
			{
				man->FillSNSDetection(eDep/MeV, preKE/MeV , trackKE/MeV, pdgCode, weight, postX/m, 
				postY/m, postZ/m, evtid, trackid, parentID, stepNum, time/microsecond);
				//proc, vol

                if(verbDetCsIInfo)
                {
					G4cout  << " Det "			
                    << std::setprecision(3) << preKE/MeV 
                    << " preKE(mev):postKE " << std::setprecision(3) << trackKE/MeV    
                    << " " << partName << " eDep "
                    << std::setprecision(3) << eDep/MeV <<  " mev|pre:post " <<  preVol 
                    <<  " " << postVol << " volID "<< volumeID << " " << weight 
                    << " wt|evt:track:step " << evtid << " "<< trackid << " " << stepNum
                    << "  " << preProc << " preproc|postproc " << postProc 
                    << "  " << track->GetCreatorProcess()->GetProcessName()
                    <<  " create_proc:in " << track->GetLogicalVolumeAtVertex()->GetName()
                    << "  withKE "<< track->GetVertexKineticEnergy()/MeV
                    << " post_xyz_m " << std::setprecision(3) << postX/m 
                    << " " << std::setprecision(3) 
                    << postY/m << " " << std::setprecision(3) <<  postZ/m
                    << " postStatus " << step->GetPostStepPoint()->GetStepStatus()
                    << G4endl;
                }
            }//if CsI
	}//if vol det

	
    
    //###############################################
    //NFLUX at BasementLayer
G4bool nFluxBaseLayer = true;    
    if(nFluxBaseLayer && partName == "neutron" &&
        preVol == "BasementIn" && postVol == "BasementLayer")
    {
        G4double trackKE = track->GetKineticEnergy();
        G4int evtid     = G4RunManager::GetRunManager()->GetCurrentEvent()->GetEventID();
        G4int trackid   = track->GetTrackID();
        G4double xx     = track->GetPosition().x(); //trackpos= postpos
        G4double yy     = track->GetPosition().y();
        G4double zz     = track->GetPosition().z();
        G4double weight = track->GetWeight() ; 

        G4cout  << " BaseFLUX "
            << std::setprecision(3) << trackKE/MeV    
            << " " <<  weight << " " << partName << " "<< preVol <<  " " << postVol 
            << " " << preProc << " " << postProc << " " << evtid << " " << trackid 
            << track->GetCreatorProcess()->GetProcessName()
            << " cr_pr|in " << track->GetLogicalVolumeAtVertex()->GetName()
            << " KE "<< track->GetVertexKineticEnergy()/MeV
            << " xyz_m " << std::setprecision(3) << xx/m << " " 
            << std::setprecision(3) 
            <<  yy/m << " " << std::setprecision(3) << zz/m
            << " st " << step->GetPostStepPoint()->GetStepStatus()
            << G4endl;
    }

	////############################################
	//NEUTRONS FLUX at Target and MonolithSteel

    G4bool HgNflux = false;
    if(HgNflux && partName =="neutron")
    {
        if(postVol != "HgTarget" && preVol == "HgTarget" )
        G4cout << "NFLUX_HgTargetOUT " << partName << " preKE "<< std::setprecision(3)
               << preKE/MeV << " " << preVol << " pre:post " << postVol << G4endl;

        if(preVol != "HgTarget" && postVol == "HgTarget" )
        G4cout << "NFLUX_HgTargetIN " << partName << " preKE "<< std::setprecision(3)
               << preKE/MeV << " " << preVol << " pre:post " << postVol << G4endl;
    }

    G4bool monoNflux = false;

    if(monoNflux && partName =="neutron")
    {
        G4double monOuterRad = 5.*m;
        G4double monTopZ = 8.*m;
        G4double monBotZ = -4.5*m;
        if(postVol != "MonolithSteelCyl" && preVol == "MonolithSteelCyl" )
        {
            G4double radius = std::sqrt((track->GetPosition().x()) *  
                    (track->GetPosition().x()) + (track->GetPosition().y()) *
                    (track->GetPosition().y()) ); 
            G4double prerad = std::sqrt((step->GetPreStepPoint()->GetPosition().x()) *  
                    (step->GetPreStepPoint()->GetPosition().x()) + 
                    (step->GetPreStepPoint()->GetPosition().y()) *
                    (step->GetPreStepPoint()->GetPosition().y()) ); 
            G4double postrad = std::sqrt((step->GetPostStepPoint()->GetPosition().x()) *  
                    (step->GetPostStepPoint()->GetPosition().x()) + 
                    (step->GetPostStepPoint()->GetPosition().y()) *
                    (step->GetPostStepPoint()->GetPosition().y()) ); 

            G4double zpos = step->GetPostStepPoint()->GetPosition().z();
            if(radius > monOuterRad - kCarTolerance || (zpos > monTopZ-kCarTolerance
                || zpos < monBotZ+kCarTolerance) )
            {
                G4cout << "NFLUX_monoOUT " << partName << " preKE "
                       << std::setprecision(3)<< preKE/MeV << " postKE "
                       << std::setprecision(3) << step->GetPostStepPoint()->GetKineticEnergy()
                       << " "<< preVol<< " pre:post " << postVol  << " trackrad " << radius 
                       << " prerad " << prerad << " postrad " << postrad 
                       << " stat.pre:post " << step->GetPreStepPoint()->GetStepStatus()
                       << "  " << step->GetPostStepPoint()->GetStepStatus()
                       << " postxyz " << std::setprecision(3) 
                       << step->GetPostStepPoint()->GetPosition().x() 
                       << "  "  << std::setprecision(3) 
                       << step->GetPostStepPoint()->GetPosition().y()
                       << " " << std::setprecision(3) 
                       << step->GetPostStepPoint()->GetPosition().z()
                       << " prexyz " << std::setprecision(3) 
                       << step->GetPreStepPoint()->GetPosition().x() 
                       << "  "  << std::setprecision(3) 
                       << step->GetPreStepPoint()->GetPosition().y()
                       << " " << std::setprecision(3) 
                       << step->GetPreStepPoint()->GetPosition().z()
                       << G4endl;
            }
        }
    }

    //#######################################
    //COUNT NEUTRONS produced by proton
    G4bool  verbNeutCount  = false; 
    if(verbNeutCount)
    {
        static G4int numNeutPerEvt = 0;
        static G4int staticEvtId = 0;
        static G4int beamSec     = 0;
        G4double    neutronsKE   = 0;
        G4int       numNthisStep = 0;
        G4String    thisSecPart  = "";
        G4String    thisProc     = "";
        G4bool      pFlag        = true;
        G4bool      isBeamProt   = (track->GetParentID()==0) ? true:false;
        //if(track->GetParentID() == 0)//parent is primary proton
        //{
        const std::vector<const G4Track*>* secVec=step->GetSecondaryInCurrentStep();
        //G4int thisPDG = (*secVec)[secN]->GetDynamicParticle()->GetPDGcode();

        if(postVol == "HgTarget")
        {
            for(size_t secN = 0; secN < secVec->size(); secN++)
            {
                thisSecPart = (*secVec)[secN]->GetDynamicParticle()->GetDefinition()->GetParticleName();
                if(thisSecPart == "neutron"|| thisSecPart == "proton")
                {

                    if(pFlag)
                    {
                        G4cout << "particle: "<<partName << " ke(mev) "<< std::setprecision(2) 
                            << preKE/MeV  << " Nsec " << secVec->size()
                            << " postVol " << postVol ;
                        if(isBeamProt){ G4cout  << "  :primary ";} 
                        G4cout << G4endl;
                        pFlag = false;
                    }
                    const G4VProcess* creator = (*secVec)[secN]->GetCreatorProcess();
                    if(creator) thisProc = creator->GetProcessName();

                    G4double keThisN = (*secVec)[secN]->GetDynamicParticle()->GetKineticEnergy();

                    G4cout  << " \t sec: " << thisSecPart<< " ke: " << std::setprecision(2)
                            << keThisN/MeV << " " << thisProc;
                    if(isBeamProt){ G4cout  << " \t firstImpact "; }
                    G4cout << G4endl;

                    if(thisSecPart == "neutron")
                    {
                        numNthisStep++;
                        if(isBeamProt)beamSec++; 
                        neutronsKE = neutronsKE +  keThisN;
                    }
                }//n
                //else G4cout  <<"other : " << thisSecPart << G4endl;
            }//for
        }//if Target
       // }//primary
        G4int thisEvtId = G4RunManager::GetRunManager()->GetCurrentEvent()->GetEventID();

        if(thisEvtId == staticEvtId) numNeutPerEvt += numNthisStep;
        else 
        {
            if(numNeutPerEvt>0 )
                G4cout << "####Evt " <<  thisEvtId <<" numN  " << numNeutPerEvt
                       << "  firstImpact " << beamSec << G4endl;
            numNeutPerEvt = numNthisStep;
            beamSec       = 0;//only first time needed
        }
        staticEvtId = thisEvtId;
    }//if countN
    //########## End of Neutron Count


    //NEUTRONS FLUX escaping to outofWorld
	G4bool nFluxOutOfWorld = false;
    if(nFluxOutOfWorld)
    {
		static  G4String preVolStatic = "";
		static  G4double preX  = -1;
		static  G4double preY  = -1;
		static  G4double preZ  = -1;
		static  G4double prePx = -1;
		static  G4double prePy = -1;
		static  G4double prePz = -1;
		static  G4double preKe = -1;
		static  G4bool  preExists = false;

		if(track->GetCurrentStepNumber() <=1) preExists = false;
        preVolStatic  = preVol;

		G4bool verb2 = false;
		if(verb2)
		{
			if(track->GetNextVolume())  
			G4cout << "# " << track->GetCurrentStepNumber() 
                   << postVol
			       << "   " << track->GetVolume()->GetName()
			//<< " preVol "  << preVol  
				//<< " pos: "         <<  track->GetPosition().x() //present or post
				//<< " "             <<  track->GetPosition().y()
				//<< " "             <<  track->GetPosition().z() 
				<< "  prexist " << preExists
				<< G4endl;
		}

		G4bool takeIt = (track->GetCurrentStepNumber() ==0 && track->GetTrackID()==1) ? false:true;  
        if( preVolStatic== "SNSTargetDetector") takeIt = false;
		if( preVolStatic== "World") takeIt = false;

		if( takeIt && pre && pdgCode==2112 &&
			( postVol=="SNSTargetDetector"||	postVol=="World"||
			  postVol=="OutOfWorld" )  )
		{
			preExists   = true;
			preX    = pre->GetPosition().x();
			preY    = pre->GetPosition().y();
			preZ    = pre->GetPosition().z(); // track->GetPosition().z()
			prePx   = pre->GetMomentumDirection().x();//track->GetMomentumDirection().x()
			prePy   = pre->GetMomentumDirection().y();
			prePz   = pre->GetMomentumDirection().z();
			preKe   = pre->GetKineticEnergy();
		}
	   //TODO reset when out of scope			
		if(  track->GetNextVolume() == 0 || postVol =="OutOfWorld" 	|| postVol=="World" )
		{
			if(preExists && pdgCode ==2112 ) //neutron
			{
				RunAction::CountParticles(); 
				G4bool verb = false;
				if(verb)
				{
					G4cout 
					//<< " :PART: " 
					<< " "          << partName
					<< "  "         << preVolStatic
					<< "  "         << preX
					<< "  "         << preY
					<< "  "         << preZ
					<<  " current " << track->GetPosition().x()  
					<< "  "         << track->GetPosition().y()
					<< "  "         << track->GetPosition().z()
					<< " Mom: "     << prePx   
					<< " "          << prePy 
					<< " "          << prePz
					<< " ke "       << preKe/MeV
					//<< " time " << track->GetGlobalTime()
					//<< " :proc: "   << postProc
					//<< " :prestKE: "  << pre->GetKineticEnergy()/MeV  
					//<< " :poststKE: " << pre->GetKineticEnergy()/MeV	
					//<< " trackL " << track->GetTrackLength()
					//<< " stepL " << track->GetStepLength()
					
					//VERTEX (,where this track was created) information 
					//<< " MeV.VertMom: " << track->GetVertexMomentumDirection().x()
					//<< " " << track->GetVertexMomentumDirection().y()
					//<< " " << track->GetVertexMomentumDirection().z()
					//<< "ke " << track->GetVertexKineticEnergy()/MeV
					//<< "   "<< track->GetLogicalVolumeAtVertex()->GetName()
					//<< "  VertPOS: "<< track->GetVertexPosition().x()
					//<< "  "<< track->GetVertexPosition().y()
					//<< "  "<< track->GetVertexPosition().z()
					//<< "   "<< track->GetCreatorProcess()->GetProcessName() //NOTE: check before
					//<< " model "<< track->GetCreatorModelName()
					<< G4endl;
				} //if verb
				//fill in root file
                man->FillSNSneutronFlux(0, preKE/MeV, preKe/MeV, pdgCode,  0, track->GetPosition().x()/m, 
                    track->GetPosition().y()/m, track->GetPosition().z()/m, 0, 0, 0, 0, 0);//, prePx, prePy, prePz );

			}		
		}
	} //END of FIND NEUTRONS escaping to outofWorld





	//##############################################
    //SCINTILLATOR DETECTOR analysis process
    //

	G4bool verbScint = false;
    //set verbScint if secondary size>0
	//if( step->GetSecondaryInCurrentStep()->size() )  verbScint=true;	
        
	if(verbScint)
	{
		G4ParticleDefinition* particleType = track->GetDefinition();
		G4double edep = step->GetTotalEnergyDeposit()/MeV; 
        G4StepPoint* preStep  = step->GetPreStepPoint();
        G4StepPoint* postStep = step->GetPostStepPoint();
		//NOTE prestep and postep may not exist in some cases !

		//const G4VProcess* postDefStep = postStep->GetProcessDefinedStep();
        G4cout << " eDep " << std::setprecision(4) << edep;
		if( postProc)
		{
			G4cout << " post:" << postProc << " ";		
		}else {  G4cout << " postproc: NONE ";}

		if( preProc)
		{
			G4cout << " pre:" << preProc << " ";		
		}else { G4cout << " preproc: NONE ";}

		if(trackProc){ 
			G4cout<< " trackProc:" <<trackProc << " ";
		}else { G4cout << " trackProc: NONE ";}
		


        //if(step->GetTrack()->GetParentID()==0)
        //fpSteppingManager available only in SteppingAction class
        G4TrackVector* fSecondary=fpSteppingManager->GetfSecondary();
        G4int nSecThisStep = fpSteppingManager->GetfN2ndariesAtRestDoIt()
          + fpSteppingManager->GetfN2ndariesAlongStepDoIt()
          + fpSteppingManager->GetfN2ndariesPostStepDoIt();
       //const std::vector<const G4Track*>* fSecondary=step->GetSecondaryInCurrentStep();
		
		size_t secSize = fSecondary->size();// total of all steaps so far.
        //if( secSize > 0)
		G4cout  << "secSize: " << secSize-nSecThisStep ;
		
        G4double totalKE = 0;
        G4double totalEn = track->GetTotalEnergy();
        // track->GetDynamicParticle()->GetTotalEnergy();

        if(postStep)
		    totalKE = postStep->GetKineticEnergy(); 
		
        size_t nOptPhot = 0;
        G4bool printPhot  = true;		
        if( nSecThisStep>0 ) //nSecThisStep = that of this step
        {
          for(size_t lp1 = secSize-nSecThisStep; lp1 < secSize; lp1++)
          {
			  
			  //(*fSecondary)[lp1]->GetDynamicParticle()->GetKineticEnergy();
			  //GetTotalEnergy();
//               G4String secPart = (*fSecondary)[lp1]->GetDefinition()->GetParticleName();
//               if(secPart =="neutron" || secPart == "proton" || secPart == "deutron"
//                 ||secPart == "alpha" || secPart == "gamma"  || secPart=="e-"||secPart=="e+")
//               {
                totalKE = totalKE +  (*fSecondary)[lp1]->
                                      GetDynamicParticle()->GetKineticEnergy();
                totalEn = totalEn + (*fSecondary)[lp1]->GetTotalEnergy();
             // }
              //if(postProc ~ /neutronInelastic|nCapture/ )
              //  G4cout<< " part: " << (*fSecondary)[lp1]->GetDefinition()->GetParticleName()
              //	<< " KE: " << (*fSecondary)[lp1]->GetDynamicParticle()->GetKineticEnergy()
              //  << G4endl;
			  
			  
			  
			 //optical photon 
            if(particleType == G4OpticalPhoton::Definition()) 
			{
				nOptPhot++;
				if(printPhot)
                {
                  G4cout << " Op.photon "; 
                  const G4VProcess* creator=(*fSecondary)[lp1]->GetCreatorProcess();
                  if(creator)
                  {
                    G4cout<<" sec.proc: "<< creator->GetProcessName();
                    printPhot= false;
                  }
                  G4cout << " " << G4endl;
                        
               }//print
            }//if phot
            
          }//for
        }//if secSize
        G4cout<<" nOptPhot: "<< G4endl;       

		G4bool verb4 = false;
		if(verb4)
		{
            G4double  preTotE = -1;
            if(preStep)
            {
                preKE   = preStep->GetKineticEnergy()/MeV ;
                preTotE = preStep->GetTotalEnergy()/MeV;
            }
            G4double postKE = -1, postTotE = -1;
            if(postStep)
            {
                postKE   = postStep->GetKineticEnergy()/MeV;
                postTotE =  postStep->GetTotalEnergy()/MeV;
            }

			G4cout 
			<< partName
			<< " trackID: " << track->GetTrackID()  
			<< " :prestKE: " << std::setprecision(4)<< preKE  
			<< " :poststKE: " << std::setprecision(4) << postKE
			<< " :preTotEn: " << std::setprecision(4)<< preTotE
			<< " :postTotEn: " << std::setprecision(4)<< postTotE
			//<< " :TotEn: " << std::setprecision(4) << totalEn/MeV		
			//<< " :totalKE: " << std::setprecision(4) << totalKE/MeV			
			<< " :trackKE: " << std::setprecision(4) << track->GetKineticEnergy() /MeV
			<< " :eDep: " << std::setprecision(4) << edep 
			<< " :-deltaE: " << std::setprecision(4)<< -step->GetDeltaEnergy()/MeV 
			//<< " :-deltaE-edep: "<< std::setprecision(4)<< -step->GetDeltaEnergy()/MeV-edep
			//<< " :niel: " << std::setprecision(4)<< step->GetNonIonizingEnergyDeposit()/MeV
			//<< " :proc: "<<  postStep->GetProcessDefinedStep()->GetProcessName()
			<< G4endl;
		}
        if( nSecThisStep>0 ) G4cout<<" EndProcSearchKeyWord "<< G4endl;  //don't delete this, just comment it 
    }//verbose    
    //####################################
    
}//end of userSteppingAction