21.1.2011 Kamil Sedlak

This version contains many changes!
1) Optical photon simulation is now possible - some work still may need to be done
   (e.g. the manual is not updated yet), but it should basically work already now.
2) Changes in the musrSimAna - correction of some bugs (mainly in the coincidence
    of coincidence and veto detectors) and some other improvements
This commit is contained in:
sedlak 2011-01-21 15:20:22 +00:00
parent dcc8c6119d
commit 4bfcc6aa29
17 changed files with 1266 additions and 169 deletions

View File

@ -845,7 +845,7 @@ The list of variables that can be stored in the Root tree:
\item{\bf muIniMomX, muIniMomY, muIniMomZ} (Double\_t) -- initial momentum of the muon when it was generated (in MeV/c). \item{\bf muIniMomX, muIniMomY, muIniMomZ} (Double\_t) -- initial momentum of the muon when it was generated (in MeV/c).
\item{\bf muIniPolX, muIniPolY, muIniPolZ} (Double\_t) -- initial polarisation of the muon when it was generated. \item{\bf muIniPolX, muIniPolY, muIniPolZ} (Double\_t) -- initial polarisation of the muon when it was generated.
\item{\bf muDecayDetID} (Int\_t) -- ID number of the detector in which the muon stopped and decayed. \item{\bf muDecayDetID} (Int\_t) -- ID number of the detector in which the muon stopped and decayed.
\item{\bf muDecayTime} (Double\_t) -- the time at which the muon stopped and decayed (in $\mu$s). \item{\bf muDecayTime} (Double\_t) -- the time at which the muon decayed (in $\mu$s).
\item{\bf muDecayPosX, muDecayPosY, muDecayPosZ} (Double\_t) -- the position where the muon stopped and decayed (in mm). \item{\bf muDecayPosX, muDecayPosY, muDecayPosZ} (Double\_t) -- the position where the muon stopped and decayed (in mm).
\item{\bf muDecayPolX, muDecayPolY, muDecayPolZ} (Double\_t) -- polarisation of the muon when it stopped and decayed. \item{\bf muDecayPolX, muDecayPolY, muDecayPolZ} (Double\_t) -- polarisation of the muon when it stopped and decayed.
\item{\bf muTargetTime} (Double\_t) -- time at which the muon entered the volume whose name starts by ``target'' -- usually the sample (in $\mu$s). \item{\bf muTargetTime} (Double\_t) -- time at which the muon entered the volume whose name starts by ``target'' -- usually the sample (in $\mu$s).

View File

@ -29,6 +29,7 @@
#include "G4ThreeVector.hh" #include "G4ThreeVector.hh"
#include "G4RotationMatrix.hh" #include "G4RotationMatrix.hh"
#include "G4FieldManager.hh" #include "G4FieldManager.hh"
#include "G4OpticalSurface.hh"
#include <map> #include <map>
class G4Tubs; class G4Tubs;
@ -47,7 +48,7 @@ class musrDetectorConstruction : public G4VUserDetectorConstruction
{ {
public: public:
musrDetectorConstruction(); musrDetectorConstruction(G4String steeringFileName);
~musrDetectorConstruction(); ~musrDetectorConstruction();
public: public:
@ -61,6 +62,7 @@ public:
void ReportProblemInStearingFile(char* myString); void ReportProblemInStearingFile(char* myString);
G4Material* CharToMaterial(char myString[100]); G4Material* CharToMaterial(char myString[100]);
G4LogicalVolume* FindLogicalVolume(G4String LogicalVolumeName); G4LogicalVolume* FindLogicalVolume(G4String LogicalVolumeName);
G4VPhysicalVolume* FindPhysicalVolume(G4String PhysicalVolumeName);
void SetColourOfLogicalVolume(G4LogicalVolume* pLogVol,char* colour); void SetColourOfLogicalVolume(G4LogicalVolume* pLogVol,char* colour);
private: private:
@ -73,6 +75,10 @@ private:
std::map<std::string,G4RotationMatrix*> pointerToRotationMatrix; std::map<std::string,G4RotationMatrix*> pointerToRotationMatrix;
std::map<std::string,G4FieldManager*> pointerToField; std::map<std::string,G4FieldManager*> pointerToField;
std::map<std::string,G4MaterialPropertiesTable*> materialPropertiesTableMap;
std::map<std::string,G4MaterialPropertiesTable*>::iterator itMPT;
private: private:
void DefineMaterials(); void DefineMaterials();

View File

@ -79,6 +79,9 @@ class musrRootOutput {
G4double ekVertex, G4double xVertex, G4double yVertex, G4double zVertex, G4double ekVertex, G4double xVertex, G4double yVertex, G4double zVertex,
G4int idVolVertex, G4int idProcVertex, G4int idTrackVertex, G4int particleID) ; G4int idVolVertex, G4int idProcVertex, G4int idTrackVertex, G4int particleID) ;
void SetOPSAinfo (G4int nDetectors, G4int ID, G4int nPhot, G4double timeFirst, G4double timeA,
G4double timeB, G4double timeC, G4double timeD, G4double timeE, G4double timeLast);
void SetSaveDetectorInfo (G4int ID, G4int particleID, G4double ke, G4double x, G4double y, G4double z, G4double time, void SetSaveDetectorInfo (G4int ID, G4int particleID, G4double ke, G4double x, G4double y, G4double z, G4double time,
G4double px, G4double py, G4double pz, G4double polx, G4double poly, G4double polz) ; G4double px, G4double py, G4double pz, G4double polx, G4double poly, G4double polz) ;
@ -208,7 +211,15 @@ class musrRootOutput {
static G4bool store_fieldIntegralBz1; static G4bool store_fieldIntegralBz1;
static G4bool store_fieldIntegralBz2; static G4bool store_fieldIntegralBz2;
static G4bool store_fieldIntegralBz3; static G4bool store_fieldIntegralBz3;
static G4bool store_odet_ID;
static G4bool store_odet_nPhot;
static G4bool store_odet_timeFirst;
static G4bool store_odet_timeA;
static G4bool store_odet_timeB;
static G4bool store_odet_timeC;
static G4bool store_odet_timeD;
static G4bool store_odet_timeE;
static G4bool store_odet_timeLast;
static G4int oldEventNumberInG4EqEMFieldWithSpinFunction; static G4int oldEventNumberInG4EqEMFieldWithSpinFunction;
@ -299,6 +310,21 @@ class musrRootOutput {
G4int det_VvvTrackID[det_nMax]; G4int det_VvvTrackID[det_nMax];
G4int det_VvvParticleID[det_nMax]; G4int det_VvvParticleID[det_nMax];
public:
static const Int_t odet_nMax=det_nMax;
private:
G4int odet_n;
G4int odet_ID[odet_nMax];
G4int odet_nPhot[odet_nMax];
G4double odet_timeFirst[odet_nMax];
G4double odet_timeA[odet_nMax];
G4double odet_timeB[odet_nMax];
G4double odet_timeC[odet_nMax];
G4double odet_timeD[odet_nMax];
G4double odet_timeE[odet_nMax];
G4double odet_timeLast[odet_nMax];
public: public:
static const Int_t save_nMax=1000; static const Int_t save_nMax=1000;

View File

@ -31,26 +31,87 @@
class G4Step; class G4Step;
class G4HCofThisEvent; class G4HCofThisEvent;
class signalInfo {
public:
signalInfo(G4int id, G4int nP, G4double tFirst,
G4double tA, G4double tB, G4double tC, G4double tD, G4double tE, G4double tLast) {
detID=id; nPhot=nP; timeFirst=tFirst;
timeA=tA; timeB=tB; timeC=tC; timeD=tD; timeE=tE; timeLast=tLast;}
~signalInfo() {}
void transferDataToRoot(musrRootOutput* myRootOut, G4int nn) {
myRootOut->SetOPSAinfo(nn,detID,nPhot,timeFirst,timeA,timeB,timeC,timeD,timeE,timeLast);
}
private:
G4int detID;
G4int nPhot;
G4int nPhot_abs;
G4int nPhot_refl;
G4int nPhot_other;
G4double timeFirst;
G4double timeA;
G4double timeB;
G4double timeC;
G4double timeD;
G4double timeE;
G4double timeLast;
};
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
class musrScintSD : public G4VSensitiveDetector class musrScintSD : public G4VSensitiveDetector
{ {
public: public:
musrScintSD(G4String); static musrScintSD* GetInstance();
~musrScintSD(); musrScintSD(G4String);
~musrScintSD();
void Initialize(G4HCofThisEvent*); void Initialize(G4HCofThisEvent*);
G4bool ProcessHits(G4Step*, G4TouchableHistory*); G4bool ProcessHits(G4Step*, G4TouchableHistory*);
void EndOfEvent(G4HCofThisEvent*); void EndOfEvent(G4HCofThisEvent*);
// Optical Photon Signal Analysis (OPSA)
void Set_OPSA_minNrOfDetectedPhotons(G4int val) {OPSA_minNrOfDetectedPhotons=val;}
void Set_OPSA_SignalSeparationTime(G4double val) {OPSA_signalSeparationTime=val;}
void Set_OPSA_frac(G4double a, G4double b, G4double c, G4double d, G4double e)
{OPSA_fracA=a; OPSA_fracB=b; OPSA_fracC=c; OPSA_fracD=d; OPSA_fracE=e;}
void AddEventIDToMultimapOfEventIDsForOPSAhistos (G4int ev_ID, G4int detector_ID)
{bool_multimapOfEventIDsForOPSAhistosEXISTS=true; multimapOfEventIDsForOPSAhistos.insert(std::pair<G4int,G4int>(ev_ID,detector_ID));}
void SetOPSAhistoBinning(Int_t nBins, Double_t min, Double_t max) {OPSAhistoNbin=nBins; OPSAhistoMin=min; OPSAhistoMax=max;}
void ProcessOpticalPhoton(G4Step*);
void EndOfEvent_OptiacalPhotons();
private: private:
static musrScintSD* pointer;
musrScintHitsCollection* scintCollection; musrScintHitsCollection* scintCollection;
G4bool myStoreOnlyEventsWithHits; G4bool myStoreOnlyEventsWithHits;
G4int myStoreOnlyEventsWithHitInDetID; G4int myStoreOnlyEventsWithHitInDetID;
G4double mySignalSeparationTime; G4double mySignalSeparationTime;
G4bool myStoreOnlyTheFirstTimeHit; G4bool myStoreOnlyTheFirstTimeHit;
G4bool boolIsVvvInfoRequested; G4bool boolIsVvvInfoRequested;
musrRootOutput* myRootOutput;
// for optical photon counting
typedef std::multimap<G4double,Int_t> optHitDetectorMapType;
typedef std::map<Int_t,optHitDetectorMapType*> optHitMapType;
optHitMapType optHitMap;
// for optical photon signal analysis (OPSA)
G4int OPSA_minNrOfDetectedPhotons;
G4double OPSA_signalSeparationTime;
G4double OPSA_fracA;
G4double OPSA_fracB;
G4double OPSA_fracC;
G4double OPSA_fracD;
G4double OPSA_fracE;
typedef std::multimap<G4int,signalInfo*> OPSA_signal_MapType;
OPSA_signal_MapType OPSA_signal_Map;
G4bool bool_multimapOfEventIDsForOPSAhistosEXISTS;
typedef std::multimap<G4int,G4int> multimapOfEventIDsForOPSAhistos_Type;
multimapOfEventIDsForOPSAhistos_Type multimapOfEventIDsForOPSAhistos;
TH1D* OPSAhisto;
Int_t OPSAhistoNbin;
Double_t OPSAhistoMin, OPSAhistoMax;
}; };
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......

View File

@ -23,7 +23,6 @@
#ifndef musrSteppingAction_h #ifndef musrSteppingAction_h
#define musrSteppingAction_h 1 #define musrSteppingAction_h 1
#include "G4UserSteppingAction.hh" #include "G4UserSteppingAction.hh"
#include "G4ProcessManager.hh" #include "G4ProcessManager.hh"
#include "globals.hh" #include "globals.hh"
@ -32,6 +31,7 @@
class G4Timer; class G4Timer;
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
class musrSteppingAction : public G4UserSteppingAction class musrSteppingAction : public G4UserSteppingAction
@ -55,10 +55,10 @@ class musrSteppingAction : public G4UserSteppingAction
void SetCalculationOfFieldIntegralRequested(G4bool decision) {boolCalculateFieldIntegral = decision;} void SetCalculationOfFieldIntegralRequested(G4bool decision) {boolCalculateFieldIntegral = decision;}
private: private:
musrRootOutput* myRootOutput;
G4Timer* timer; G4Timer* timer;
time_t realTimeWhenThisEventStarted; time_t realTimeWhenThisEventStarted;
static musrSteppingAction* pointer; static musrSteppingAction* pointer;
musrRootOutput* myRootOutput;
G4bool muAlreadyWasInTargetInThisEvent; G4bool muAlreadyWasInTargetInThisEvent;
G4bool muAlreadyWasInM0InThisEvent; G4bool muAlreadyWasInM0InThisEvent;

View File

@ -3,6 +3,7 @@
#include "musrPrimaryGeneratorAction.hh" #include "musrPrimaryGeneratorAction.hh"
#include "musrRunAction.hh" #include "musrRunAction.hh"
#include "musrEventAction.hh" #include "musrEventAction.hh"
//#include "StackingAction.hh"
#include "musrSteppingAction.hh" #include "musrSteppingAction.hh"
#include "musrSteppingVerbose.hh" #include "musrSteppingVerbose.hh"
@ -11,6 +12,10 @@
#include "G4UIterminal.hh" #include "G4UIterminal.hh"
#include "G4UItcsh.hh" #include "G4UItcsh.hh"
//#include <TApplication.h>
//#include <TSystem.h>
// The following two lines are needed to cope with the problem of // The following two lines are needed to cope with the problem of
// "Error in <TPluginManager::FindHandler>: Cannot find plugin handler for TVirtualStreamerInfo! // "Error in <TPluginManager::FindHandler>: Cannot find plugin handler for TVirtualStreamerInfo!
// Does $ROOTSYS/etc/plugins/TVirtualStreamerInfo exist?" // Does $ROOTSYS/etc/plugins/TVirtualStreamerInfo exist?"
@ -53,6 +58,8 @@ int main(int argc,char** argv) {
// Create class "musrErrorMessage" // Create class "musrErrorMessage"
musrErrorMessage* myErrorMessage = new musrErrorMessage(); musrErrorMessage* myErrorMessage = new musrErrorMessage();
// TApplication* myapp=new TApplication("myapp",0,0);
// Create Root class for storing the output of the Geant simulation // Create Root class for storing the output of the Geant simulation
musrRootOutput* myRootOutput = new musrRootOutput(); musrRootOutput* myRootOutput = new musrRootOutput();
@ -68,13 +75,14 @@ int main(int argc,char** argv) {
// UserInitialization classes (mandatory) // UserInitialization classes (mandatory)
musrDetectorConstruction* musrdetector = new musrDetectorConstruction; // musrDetectorConstruction* musrdetector = new musrDetectorConstruction;
if (argc>1) { if (argc>1) {
G4int myRunNr=atoi(argv[1]); // Get the run number from the name of the G4int myRunNr=atoi(argv[1]); // Get the run number from the name of the
// parameter file, if it starts with a number. // parameter file, if it starts with a number.
if (myRunNr>0) {runManager->SetRunIDCounter(myRunNr);} if (myRunNr>0) {runManager->SetRunIDCounter(myRunNr);}
musrdetector->SetInputParameterFileName(argv[1]); // musrdetector->SetInputParameterFileName(argv[1]);
} }
musrDetectorConstruction* musrdetector = new musrDetectorConstruction(steeringFileName);
runManager->SetUserInitialization(musrdetector); runManager->SetUserInitialization(musrdetector);
runManager->SetUserInitialization(new musrPhysicsList); runManager->SetUserInitialization(new musrPhysicsList);
@ -89,6 +97,7 @@ int main(int argc,char** argv) {
runManager->SetUserAction(new musrPrimaryGeneratorAction(musrdetector)); runManager->SetUserAction(new musrPrimaryGeneratorAction(musrdetector));
runManager->SetUserAction(new musrRunAction); runManager->SetUserAction(new musrRunAction);
runManager->SetUserAction(new musrEventAction); runManager->SetUserAction(new musrEventAction);
// runManager->SetUserAction(new StackingAction);
runManager->SetUserAction(new musrSteppingAction); runManager->SetUserAction(new musrSteppingAction);
//Initialize G4 kernel //Initialize G4 kernel
@ -133,6 +142,8 @@ int main(int argc,char** argv) {
} }
} }
// myapp->Run(kTRUE);
#ifdef G4VIS_USE #ifdef G4VIS_USE
delete visManager; delete visManager;
#endif #endif

View File

@ -75,12 +75,12 @@ void musrAnalysis::ReadInInputParameters(char* charV1190FileName) {
exit(1); exit(1);
} }
std::cout << "Configuration file \"" << charV1190FileName << "\" was opened."<<std::endl; std::cout << "Configuration file \"" << charV1190FileName << "\" was opened."<<std::endl;
char line[1001]; char line[10001];
// Write out the configuration file into the output file: // Write out the configuration file into the output file:
std::cout << "\n\n....oooOO0OOooo........oooOO0OOooo......Configuration file used for this run....oooOO0OOooo........oooOO0OOooo......"<<std::endl; std::cout << "\n\n....oooOO0OOooo........oooOO0OOooo......Configuration file used for this run....oooOO0OOooo........oooOO0OOooo......"<<std::endl;
while (!feof(fSteeringFile)) { while (!feof(fSteeringFile)) {
fgets(line,1000,fSteeringFile); fgets(line,10000,fSteeringFile);
// if ((line[0]!='#')&&(line[0]!='\n')&&(line[0]!='\r')) // TS: Do not print comments // if ((line[0]!='#')&&(line[0]!='\n')&&(line[0]!='\r')) // TS: Do not print comments
std::cout << line; std::cout << line;
} }
@ -120,7 +120,7 @@ void musrAnalysis::ReadInInputParameters(char* charV1190FileName) {
// } // }
// } // }
while (!feof(fSteeringFile)) { while (!feof(fSteeringFile)) {
fgets(line,1000,fSteeringFile); fgets(line,10000,fSteeringFile);
if ((line[0]!='#')&&(line[0]!='\n')&&(line[0]!='\r')&&(line[0]!='$')&&(line[0]!='!')) { if ((line[0]!='#')&&(line[0]!='\n')&&(line[0]!='\r')&&(line[0]!='$')&&(line[0]!='!')) {
char tmpString0[200]="Unset"; char tmpString0[200]="Unset";
char tmpString1[200]="Unset"; char tmpString1[200]="Unset";
@ -194,6 +194,18 @@ void musrAnalysis::ReadInInputParameters(char* charV1190FileName) {
sscanf(&line[strlen("MUSRMODE=")],"%s",&tmpString1); sscanf(&line[strlen("MUSRMODE=")],"%s",&tmpString1);
musrMode = tmpString1[0]; musrMode = tmpString1[0];
} }
else if (strcmp(tmpString0,"CLONECHANNEL")==0) {
int ichannel_orig_tmp, ichannel_new_tmp;
sscanf(&line[0],"%*s %d %d",&ichannel_orig_tmp,&ichannel_new_tmp);
bool_clonedChannelsMultimap_NotEmpty = true;
clonedChannelsMultimap.insert(std::pair<int,int>(ichannel_orig_tmp,ichannel_new_tmp));
}
else if (strcmp(tmpString0,"DEBUGEVENT")==0) {
int ieventToDebug_tmp, iLevelToDebug_tmp;
sscanf(&line[0],"%*s %d %d",&ieventToDebug_tmp,&iLevelToDebug_tmp);
bool_debugingRequired=true;
debugEventMap.insert(std::pair<int,int>(ieventToDebug_tmp,iLevelToDebug_tmp));
}
else if (strncmp(tmpString0,"musrTH",strlen("musrTH"))==0) { else if (strncmp(tmpString0,"musrTH",strlen("musrTH"))==0) {
// Definition of the histograms - either musrTH1D or musrTH2D // Definition of the histograms - either musrTH1D or musrTH2D
int beginningOfHistoTitle=0, endOfHistoTitle =0; int beginningOfHistoTitle=0, endOfHistoTitle =0;
@ -355,6 +367,18 @@ void musrAnalysis::ReadInInputParameters(char* charV1190FileName) {
else if (strcmp(conditionNameTMP,"pileupEventCandidate")==0) conditionMap[iConditionTMP]=&pileupEventCandidate; else if (strcmp(conditionNameTMP,"pileupEventCandidate")==0) conditionMap[iConditionTMP]=&pileupEventCandidate;
else if (strcmp(conditionNameTMP,"pileupEvent")==0) conditionMap[iConditionTMP]=&pileupEvent; else if (strcmp(conditionNameTMP,"pileupEvent")==0) conditionMap[iConditionTMP]=&pileupEvent;
else if (strcmp(conditionNameTMP,"goodEvent_det_AND_muonDecayedInSample_gen")==0) conditionMap[iConditionTMP]=&goodEvent_det_AND_muonDecayedInSample_gen; else if (strcmp(conditionNameTMP,"goodEvent_det_AND_muonDecayedInSample_gen")==0) conditionMap[iConditionTMP]=&goodEvent_det_AND_muonDecayedInSample_gen;
else if (strcmp(conditionNameTMP,"goodEvent_F_det")==0) conditionMap[iConditionTMP]=&goodEvent_F_det;
else if (strcmp(conditionNameTMP,"goodEvent_B_det")==0) conditionMap[iConditionTMP]=&goodEvent_B_det;
else if (strcmp(conditionNameTMP,"goodEvent_U_det")==0) conditionMap[iConditionTMP]=&goodEvent_U_det;
else if (strcmp(conditionNameTMP,"goodEvent_D_det")==0) conditionMap[iConditionTMP]=&goodEvent_D_det;
else if (strcmp(conditionNameTMP,"goodEvent_L_det")==0) conditionMap[iConditionTMP]=&goodEvent_L_det;
else if (strcmp(conditionNameTMP,"goodEvent_R_det")==0) conditionMap[iConditionTMP]=&goodEvent_R_det;
else if (strcmp(conditionNameTMP,"goodEvent_F_det_AND_pileupEvent")==0) conditionMap[iConditionTMP]=&goodEvent_F_det_AND_pileupEvent;
else if (strcmp(conditionNameTMP,"goodEvent_B_det_AND_pileupEvent")==0) conditionMap[iConditionTMP]=&goodEvent_B_det_AND_pileupEvent;
else if (strcmp(conditionNameTMP,"goodEvent_U_det_AND_pileupEvent")==0) conditionMap[iConditionTMP]=&goodEvent_U_det_AND_pileupEvent;
else if (strcmp(conditionNameTMP,"goodEvent_D_det_AND_pileupEvent")==0) conditionMap[iConditionTMP]=&goodEvent_D_det_AND_pileupEvent;
else if (strcmp(conditionNameTMP,"goodEvent_L_det_AND_pileupEvent")==0) conditionMap[iConditionTMP]=&goodEvent_L_det_AND_pileupEvent;
else if (strcmp(conditionNameTMP,"goodEvent_R_det_AND_pileupEvent")==0) conditionMap[iConditionTMP]=&goodEvent_R_det_AND_pileupEvent;
else { else {
std::cout<<" !!! ERROR: Condition of the name \""<<conditionNameTMP<<"\" not predefined ==> Add it in the musrAnalysis.cxx S T O P !!!"<<std::endl; std::cout<<" !!! ERROR: Condition of the name \""<<conditionNameTMP<<"\" not predefined ==> Add it in the musrAnalysis.cxx S T O P !!!"<<std::endl;
exit(1); exit(1);
@ -404,6 +428,47 @@ void musrAnalysis::ReadInInputParameters(char* charV1190FileName) {
nscan = sscanf(pch,"%d %g",&N1,&PHASE_SHIFT); nscan = sscanf(pch,"%d %g",&N1,&PHASE_SHIFT);
} while (nscan==2); } while (nscan==2);
} }
else if (strcmp(tmpString0,"counterGrouping")==0) {
int nscan; int N1; char NAME[100];
char *pch = line + strlen("counterGrouping");
char counterGroupName[100];
nscan = sscanf(pch,"%s",counterGroupName);
char* pch1 = strstr(pch,counterGroupName)+strlen(counterGroupName);
pch = pch1;
do {
nscan = sscanf(pch,"%d",&N1);
if (strcmp(counterGroupName,"F")==0) F_posCounterList.push_back(N1);
else if (strcmp(counterGroupName,"B")==0) B_posCounterList.push_back(N1);
else if (strcmp(counterGroupName,"U")==0) U_posCounterList.push_back(N1);
else if (strcmp(counterGroupName,"D")==0) D_posCounterList.push_back(N1);
else if (strcmp(counterGroupName,"L")==0) L_posCounterList.push_back(N1);
else if (strcmp(counterGroupName,"R")==0) R_posCounterList.push_back(N1);
else {
std::cout<<"\n\n UNKNOWN COUNTER GROUP REQUIRED !!! =====> S T O P F O R C E D"<<std::endl;
std::cout<<line<<std::endl;
exit(1);
}
std::cout<<"counterGroupName="<<counterGroupName<<" N1="<<N1<<std::endl;
nscan = sscanf(pch,"%s",NAME);
char* pch2 = strstr(pch ,NAME)+strlen(NAME);
pch=pch2;
nscan = sscanf(pch,"%d",&N1);
} while (nscan==1);
}
else if (strcmp(tmpString0,"artificiallyChangeMuDecayTime")==0) {
float min, max, mmmin, mmmax;
sscanf(&line[0],"%*s %g %g %g %g %g %g %g",&min,&max,&mmmin,&mmmax);
bool_muDecayTimeTransformation = true;
muDecayTime_t_min = min;
muDecayTime_t_max = max;
muDecayTime_Transformation_min = mmmin;
muDecayTime_Transformation_max = mmmax;
if ((muDecayTime_t_max <= muDecayTime_t_min) || (muDecayTime_Transformation_max <= muDecayTime_Transformation_min)) {
std::cout<<" ERROR! musrAnalysis: error when setting the \"artificiallyChangeMuDecayTime\" parameters! Min > Max !!!"<<std::endl;
std::cout<<" ==> S T O P "<<std::endl;
exit(1);
}
}
else if (strcmp(tmpString0,"fit")==0) { else if (strcmp(tmpString0,"fit")==0) {
char histoName[100]; char functionName[100]; float xMin; float xMax; float p0, p1, p2, p3, p4, p5, p6; char histoName[100]; char functionName[100]; float xMin; float xMax; float p0, p1, p2, p3, p4, p5, p6;
sscanf(&line[0],"%*s %s %s %g %g %g %g %g %g %g",histoName,functionName,&xMin,&xMax,&p0,&p1,&p2,&p3,&p4,&p5,&p6); sscanf(&line[0],"%*s %s %s %g %g %g %g %g %g %g",histoName,functionName,&xMin,&xMax,&p0,&p1,&p2,&p3,&p4,&p5,&p6);
@ -453,7 +518,8 @@ void musrAnalysis::ReadInInputParameters(char* charV1190FileName) {
funct -> SetParameter(1,p1); funct -> SetParameter(1,p1);
} }
else if (strcmp(functionName,"rotFrameTime20")==0) { else if (strcmp(functionName,"rotFrameTime20")==0) {
funct = new TF1("rotFrameTime20","[2]*exp(-x/2.19703)*cos(x*[0]+[1]) "); // funct = new TF1("rotFrameTime20","[2]*exp(-x/2.19703)*cos(x*[0]+[1]) ");
funct = new TF1("rotFrameTime20","[2]*cos(x*[0]+[1]) ");
funct -> SetParameter(0,p0); funct -> SetParameter(0,p0);
funct -> SetParameter(1,p1); funct -> SetParameter(1,p1);
funct -> SetParameter(2,p2); funct -> SetParameter(2,p2);
@ -574,22 +640,8 @@ void musrAnalysis::ReadInInputParameters(char* charV1190FileName) {
pileupWindowBinMax = Long64_t(pileupWindowMax/tdcresolution); pileupWindowBinMax = Long64_t(pileupWindowMax/tdcresolution);
dataWindowBinMin = Long64_t( dataWindowMin/tdcresolution); dataWindowBinMin = Long64_t( dataWindowMin/tdcresolution);
dataWindowBinMax = Long64_t( dataWindowMax/tdcresolution); dataWindowBinMax = Long64_t( dataWindowMax/tdcresolution);
for (counterMapType::const_iterator it = allCounterMap.begin(); it!=allCounterMap.end(); ++it) { for (counterMapType::const_iterator it = allCounterMap.begin(); it!=allCounterMap.end(); ++it) {
char DetectorType = (it->second)->GetCounterType();
if (DetectorType=='M') {
(it->second)->SetMaxCoincidenceTimeWindow(pileupWindowBinMin);
(it->second)->SetCoincidenceTimeWindow(pileupWindowBinMin,pileupWindowBinMax);
(it->second)->SetCoincidenceTimeWindowOfAllCoincidenceDetectors(-mcoincwin,-mcoincwin,mcoincwin);
}
else if (DetectorType=='P') {
(it->second)->SetMaxCoincidenceTimeWindow(dataWindowBinMin);
(it->second)->SetCoincidenceTimeWindow(dataWindowBinMin,dataWindowBinMax);
(it->second)->SetCoincidenceTimeWindowOfAllCoincidenceDetectors(-pcoincwin,-pcoincwin,pcoincwin);
}
else if (DetectorType=='V') {
(it->second)->SetMaxCoincidenceTimeWindow(-vcoincwin);
(it->second)->SetCoincidenceTimeWindow(-vcoincwin,vcoincwin);
}
int iChanNr = (it->second)->GetCounterNr(); int iChanNr = (it->second)->GetCounterNr();
for (std::multimap<int,int>::iterator itCoinc = tmpCoincidenceMultimap.begin(); itCoinc != tmpCoincidenceMultimap.end(); ++itCoinc) { for (std::multimap<int,int>::iterator itCoinc = tmpCoincidenceMultimap.begin(); itCoinc != tmpCoincidenceMultimap.end(); ++itCoinc) {
if ((*itCoinc).first == iChanNr) { if ((*itCoinc).first == iChanNr) {
@ -606,6 +658,26 @@ void musrAnalysis::ReadInInputParameters(char* charV1190FileName) {
} }
} }
for (counterMapType::const_iterator it = allCounterMap.begin(); it!=allCounterMap.end(); ++it) {
char DetectorType = (it->second)->GetCounterType();
if (DetectorType=='M') {
(it->second)->SetMaxCoincidenceTimeWindow(pileupWindowBinMin);
(it->second)->SetCoincidenceTimeWindow_M(pileupWindowBinMin,pileupWindowBinMax);
(it->second)->SetCoincidenceTimeWindowOfAllCoincidenceDetectors('M',-mcoincwin+pileupWindowBinMin,-mcoincwin,mcoincwin);
(it->second)->SetCoincidenceTimeWindowOfAllVetoDetectors(-mcoincwin+pileupWindowBinMin,-vcoincwin,vcoincwin);
}
else if (DetectorType=='P') {
(it->second)->SetMaxCoincidenceTimeWindow(dataWindowBinMin);
(it->second)->SetCoincidenceTimeWindow_P(dataWindowBinMin,dataWindowBinMax);
(it->second)->SetCoincidenceTimeWindowOfAllCoincidenceDetectors('P',-pcoincwin+dataWindowBinMin,-pcoincwin,pcoincwin);
(it->second)->SetCoincidenceTimeWindowOfAllVetoDetectors(-pcoincwin+dataWindowBinMin,-vcoincwin,vcoincwin);
}
// else if (DetectorType=='V') {
// (it->second)->SetMaxCoincidenceTimeWindow(-vcoincwin);
// (it->second)->SetCoincidenceTimeWindow(-vcoincwin,vcoincwin);
// }
}
// for (int j=0; j<maxChannels; j++) { // for (int j=0; j<maxChannels; j++) {
// for (multimap<int,int>::iterator itCoinc = tmpCoincidenceMultimap.begin(); itCoinc != tmpCoincidenceMultimap.end(); ++itCoinc) { // for (multimap<int,int>::iterator itCoinc = tmpCoincidenceMultimap.begin(); itCoinc != tmpCoincidenceMultimap.end(); ++itCoinc) {
// std::cout << " houby [" << (*itCoinc).first << ", " << (*itCoinc).second << "]" << std::endl; // std::cout << " houby [" << (*itCoinc).first << ", " << (*itCoinc).second << "]" << std::endl;
@ -656,7 +728,6 @@ void musrAnalysis::CreateHistograms() {
// omega = 850.62*fieldValue; // value used in Geant ? // omega = 850.62*fieldValue; // value used in Geant ?
omega = 851.610*fieldValue; // value from the fits of the data omega = 851.610*fieldValue; // value from the fits of the data
hInfo->Fill(1, fieldValue); hInfo->Fill(1, fieldValue);
hInfo->Fill(6, runID); hInfo->Fill(6, runID);
hInfo->Fill(7, hGeantParameters->GetBinContent(7)); hInfo->Fill(7, hGeantParameters->GetBinContent(7));
@ -731,13 +802,19 @@ void musrAnalysis::AnalyseEvent(Long64_t iiiEntry) {
// Loop over several next event and preprocess them (i.e. fill // Loop over several next event and preprocess them (i.e. fill
// them into the lists/maps of the class musrCounter). // them into the lists/maps of the class musrCounter).
if (bool_debugingRequired) {
if (debugEventMap[eventID]>0) {std::cout<<"DEBUGEVENT "<<eventID<<"_________________(before \"PreprocessEvent\"_________"<<std::endl;}
}
while (((iiiEntry>lastPreprocessedEntry)||(((nextUnfilledEventTime-currentTime)<safeTimeWindow))&&(!boolInfinitelyLowMuonRate)) && (lastPreprocessedEntry+1<nentries)) { while (((iiiEntry>lastPreprocessedEntry)||(((nextUnfilledEventTime-currentTime)<safeTimeWindow))&&(!boolInfinitelyLowMuonRate)) && (lastPreprocessedEntry+1<nentries)) {
Double_t deltaT = PreprocessEvent(lastPreprocessedEntry+1); Double_t deltaT = PreprocessEvent(lastPreprocessedEntry+1);
nextUnfilledEventTime+=deltaT; nextUnfilledEventTime+=deltaT;
}; };
fChain->GetEntry(iiiEntry); InitialiseEvent(); fChain->GetEntry(iiiEntry); InitialiseEvent();
if (bool_debugingRequired) {
if (debugEventMap[eventID]>2) PrintHitsInAllCounters();
if (debugEventMap[eventID]>1) {std::cout<<"DEBUGEVENT "<<eventID<<"_________________(after \"PreprocessEvent\"_________"<<std::endl;}
}
// Loop over all interesting "moments", which are: // Loop over all interesting "moments", which are:
// 1) any hit in the muon counter // 1) any hit in the muon counter
// 2) any new event (even if nothing was detected in the muon counter) // 2) any new event (even if nothing was detected in the muon counter)
@ -751,7 +828,14 @@ void musrAnalysis::AnalyseEvent(Long64_t iiiEntry) {
// for (counterMapType::const_iterator it = allCounterMap.begin(); it!=allCounterMap.end(); ++it) { // for (counterMapType::const_iterator it = allCounterMap.begin(); it!=allCounterMap.end(); ++it) {
// (*it).second->myPrintThisCounter(eventID); // (*it).second->myPrintThisCounter(eventID);
// } // }
if (bool_debugingRequired) {
if (debugEventMap[eventID]>1) {std::cout<<"DEBUGEVENT "<<eventID<<"_________________(before \"FillHistograms\"_________"<<std::endl;}
}
FillHistograms(iiiEntry); FillHistograms(iiiEntry);
if (bool_debugingRequired) {
if (debugEventMap[eventID]>1) {std::cout<<"DEBUGEVENT "<<eventID<<"_________________(after \"FillHistograms\"_________"<<std::endl;}
}
currentTime+=timeToNextEvent*muonRateFactor; currentTime+=timeToNextEvent*muonRateFactor;
@ -790,6 +874,14 @@ void musrAnalysis::RewindAllTimeInfo(Long64_t timeBinsToRewind) {
//================================================================ //================================================================
void musrAnalysis::PrintHitsInAllCounters() {
std::cout<<"___________________\n";
for (counterMapType::const_iterator it = allCounterMap.begin(); it!=allCounterMap.end(); ++it) {
(*it).second->myPrintThisCounter(eventID,0);
}
}
//================================================================
void musrAnalysis::FillHistograms(Int_t iiiEntry) { void musrAnalysis::FillHistograms(Int_t iiiEntry) {
// std::cout<<"musrAnalysis::FillHistograms() event="<<eventID<<" , bool="<<generatedInfo<<","<<detectorInfo<<std::endl; // std::cout<<"musrAnalysis::FillHistograms() event="<<eventID<<" , bool="<<generatedInfo<<","<<detectorInfo<<std::endl;
@ -823,7 +915,10 @@ void musrAnalysis::FillHistograms(Int_t iiiEntry) {
// Check whether there was good hit in the Positron counter // Check whether there was good hit in the Positron counter
// Long64_t dataBinMin = (mCounterHitExistsForThisEventID) ? timeBin0+dataWindowBinMin : timeBinOfThePreviouslyProcessedHit-100000000; // Long64_t dataBinMin = (mCounterHitExistsForThisEventID) ? timeBin0+dataWindowBinMin : timeBinOfThePreviouslyProcessedHit-100000000;
// Long64_t dataBinMax = (mCounterHitExistsForThisEventID) ? timeBin0+dataWindowBinMax : timeBinOfThePreviouslyProcessedHit+100000000; // Long64_t dataBinMax = (mCounterHitExistsForThisEventID) ? timeBin0+dataWindowBinMax : timeBinOfThePreviouslyProcessedHit+100000000;
pileup_eventID = -1001;
pileup_muDecayDetID_double = -1001; pileup_muDecayDetID_double = -1001;
pileup_muDecayPosZ = -1000000000;
pileup_muDecayPosR = -1000000000;
if (mCounterHitExistsForThisEventID) { if (mCounterHitExistsForThisEventID) {
numberOfGoodMuons++; numberOfGoodMuons++;
Long64_t dataBinMin = timeBin0+dataWindowBinMin; Long64_t dataBinMin = timeBin0+dataWindowBinMin;
@ -833,7 +928,10 @@ void musrAnalysis::FillHistograms(Int_t iiiEntry) {
if (pCounterHitExistsForThisEventID && (kEntry>0)&&(posEntry>0)&&(kEntry!=posEntry)) { if (pCounterHitExistsForThisEventID && (kEntry>0)&&(posEntry>0)&&(kEntry!=posEntry)) {
// This must be a pileup event (positron counter hit comes from the different event than the muon counter hit) // This must be a pileup event (positron counter hit comes from the different event than the muon counter hit)
fChain->GetEntry(posEntry); fChain->GetEntry(posEntry);
pileup_eventID = eventID;
pileup_muDecayDetID_double = muDecayDetID; pileup_muDecayDetID_double = muDecayDetID;
pileup_muDecayPosZ = muDecayPosZ;
pileup_muDecayPosR = sqrt(muDecayPosX*muDecayPosX+muDecayPosY*muDecayPosY);
// if (pileup_muDecayDetID_double==-1000) { // if (pileup_muDecayDetID_double==-1000) {
// std::cout<<"DEBUG: pileup_muDecayDetID_double==-1000, posEntry="<<posEntry<<", eventID="<<eventID<<", idetP_edep="<<idetP_edep<<", idetP="<<idetP<<", idetP_ID="<<idetP_ID<<std::endl; // std::cout<<"DEBUG: pileup_muDecayDetID_double==-1000, posEntry="<<posEntry<<", eventID="<<eventID<<", idetP_edep="<<idetP_edep<<", idetP="<<idetP<<", idetP_ID="<<idetP_ID<<std::endl;
// } // }
@ -875,7 +973,40 @@ void musrAnalysis::FillHistograms(Int_t iiiEntry) {
pileupEventCandidate = ((kEntry>0)&&(posEntry>0)&&(kEntry!=posEntry)) ? true:false; pileupEventCandidate = ((kEntry>0)&&(posEntry>0)&&(kEntry!=posEntry)) ? true:false;
pileupEvent = pileupEventCandidate&&goodEvent_det; pileupEvent = pileupEventCandidate&&goodEvent_det;
goodEvent_det_AND_muonDecayedInSample_gen = goodEvent_det && muonDecayedInSample_gen; goodEvent_det_AND_muonDecayedInSample_gen = goodEvent_det && muonDecayedInSample_gen;
// if (pileupEvent) std::cout<<"pileupEvent (eventID="<<eventID<<std::endl;
// posCounterList_Iterator = find(F_posCounterList.begin(), F_posCounterList.end(), idetP_ID);
// goodEvent_F_det = posCounterList_Iterator != F_posCounterList.end()
goodEvent_F_det = goodEvent_det && ( (find(F_posCounterList.begin(), F_posCounterList.end(), idetP_ID)) != F_posCounterList.end() );
goodEvent_B_det = goodEvent_det && ( (find(B_posCounterList.begin(), B_posCounterList.end(), idetP_ID)) != B_posCounterList.end() );
goodEvent_U_det = goodEvent_det && ( (find(U_posCounterList.begin(), U_posCounterList.end(), idetP_ID)) != U_posCounterList.end() );
goodEvent_D_det = goodEvent_det && ( (find(D_posCounterList.begin(), D_posCounterList.end(), idetP_ID)) != D_posCounterList.end() );
goodEvent_L_det = goodEvent_det && ( (find(L_posCounterList.begin(), L_posCounterList.end(), idetP_ID)) != L_posCounterList.end() );
goodEvent_R_det = goodEvent_det && ( (find(R_posCounterList.begin(), R_posCounterList.end(), idetP_ID)) != R_posCounterList.end() );
// std::cout<<"goodEvent_F_det="<<goodEvent_F_det<<std::endl;
if (pileupEvent&&goodEvent_F_det) {
std::cout<<" DEBUG: Pileup Event: eventID = "<<eventID<<" pileup_eventID = "<<pileup_eventID<<" det_time10 = "<<det_time10<<std::endl;
// debugEventMap.insert(std::pair<int,int>(eventID,10));
}
goodEvent_F_det_AND_pileupEvent = goodEvent_F_det && pileupEvent;
goodEvent_B_det_AND_pileupEvent = goodEvent_B_det && pileupEvent;
goodEvent_U_det_AND_pileupEvent = goodEvent_U_det && pileupEvent;
goodEvent_D_det_AND_pileupEvent = goodEvent_D_det && pileupEvent;
goodEvent_L_det_AND_pileupEvent = goodEvent_L_det && pileupEvent;
goodEvent_R_det_AND_pileupEvent = goodEvent_R_det && pileupEvent;
// if (bool_debugingRequired && muonTriggered_det) {
// std::cout<<"DEBUG: goodEvent_det: eventID="<<eventID<<std::endl;
// if (goodEvent_det) std::cout<<" ___DETECTED___"<<std::endl;
// MyPrintTree();
// MyPrintConditions();
// }
// if (pileupEvent) {
// std::cout<<"\n NEW: pileupEvent: eventID="<<eventID<<", kEntry="<<kEntry<<", posEntry="<<posEntry<< std::endl;
// std::cout<<"det_time10 = "<<det_time10<<std::endl;
// }
// Fill pileup-variables, but only if positron comes from different muon than the trigger signal // Fill pileup-variables, but only if positron comes from different muon than the trigger signal
// if (mCounterHitExistsForThisEventID&&pCounterHitExistsForThisEventID) // if (mCounterHitExistsForThisEventID&&pCounterHitExistsForThisEventID)
@ -938,25 +1069,110 @@ void musrAnalysis::InitialiseEvent() {
Double_t musrAnalysis::PreprocessEvent(Long64_t iEn) { Double_t musrAnalysis::PreprocessEvent(Long64_t iEn) {
// std::cout<<"musrAnalysis::PreprocessEvent()"<<std::endl; // std::cout<<"musrAnalysis::PreprocessEvent()"<<std::endl;
fChain->GetEntry(iEn); InitialiseEvent(); fChain->GetEntry(iEn); InitialiseEvent();
// Clone some channels into different one, if requested by user
// (This is usefull when e.g. user splits a signal from a veto
// and uses it in two different ways - e.g. once for vetoing
// muons, and second (with a different threshold) for validating
// a positron candidate. This is initiated by the
// keyword "CLONECHANNEL" in the *.v1190 file
if (bool_clonedChannelsMultimap_NotEmpty) {
// std::cout<<"det_n="<<det_n<<std::endl;
Int_t det_n_OLD=det_n;
for (Int_t i=0; i<det_n_OLD; i++) {
// std::cout<<" det_ID["<<i<<"]="<<det_ID[i]<<" edep="<<det_edep[i]<<std::endl;
clonedChannelsMultimapType::const_iterator it = clonedChannelsMultimap.find(det_ID[i]);
// std::cout<<" clonedChannelsMultimap[i]="<<clonedChannelsMultimap[i]<<std::endl;
if (it!=clonedChannelsMultimap.end()) {
int chNumTMP = it->first;
// std::cout<<"DEBUG: chNumTMP="<<chNumTMP<<" ";
std::pair<clonedChannelsMultimapType::const_iterator,clonedChannelsMultimapType::const_iterator> ret = clonedChannelsMultimap.equal_range(chNumTMP);
for (clonedChannelsMultimapType::const_iterator ittt=ret.first; ittt!=ret.second; ++ittt) {
// std::cout << " ittt->second=" << ittt->second;
int chNumNewTMP = ittt->second;
det_ID[det_n] = chNumNewTMP;
det_edep[det_n] = det_edep[i];
det_edep_el[det_n] = det_edep_el[i];
det_edep_pos[det_n] = det_edep_pos[i];
det_edep_gam[det_n] = det_edep_gam[i];
det_edep_mup[det_n] = det_edep_mup[i];
det_nsteps[det_n] = det_nsteps[i];
det_length[det_n] = det_length[i];
det_time_start[det_n] = det_time_start[i];
det_time_end[det_n] = det_time_end[i];
det_x[det_n] = det_x[i];
det_y[det_n] = det_y[i];
det_z[det_n] = det_z[i];
det_kine[det_n] = det_kine[i];
det_VrtxKine[det_n] = det_VrtxKine[i];
det_VrtxX[det_n] = det_VrtxX[i];
det_VrtxY[det_n] = det_VrtxY[i];
det_VrtxZ[det_n] = det_VrtxZ[i];
det_VrtxVolID[det_n] = det_VrtxVolID[i];
det_VrtxProcID[det_n] = det_VrtxProcID[i];
det_VrtxTrackID[det_n] = det_VrtxTrackID[i];
det_VrtxParticleID[det_n]= det_VrtxParticleID[i];
det_VvvKine[det_n] = det_VvvKine[i];
det_VvvX[det_n] = det_VvvX[i];
det_VvvY[det_n] = det_VvvY[i];
det_VvvZ[det_n] = det_VvvZ[i];
det_VvvVolID[det_n] = det_VvvVolID[i];
det_VvvProcID[det_n] = det_VvvProcID[i];
det_VvvTrackID[det_n] = det_VvvTrackID[i];
det_VvvParticleID[det_n] = det_VvvParticleID[i];
det_n++;
}
}
}
}
// std::cout<<"\n musrAnalysis::PreprocessEvent() Filling event "<<eventID<<std::endl; // std::cout<<"\n musrAnalysis::PreprocessEvent() Filling event "<<eventID<<std::endl;
// MyPrintTree(); // MyPrintTree();
Double_t globTime = nextUnfilledEventTime; Double_t globTime = nextUnfilledEventTime;
for (Int_t i=0; i<det_n; i++) { for (Int_t i=0; i<det_n; i++) {
// // Int_t detID=det_ID[i]; // // Int_t detID=det_ID[i];
std::map<int,musrCounter*>::iterator it; std::map<int,musrCounter*>::iterator it;
it = allCounterMap.find(det_ID[i]); it = allCounterMap.find(det_ID[i]);
if (it==allCounterMap.end()) { if (it==allCounterMap.end()) {
// uncomment std::cout<<"Active detector with det_ID="<<det_ID[i]<<" not found !!!"<<std::endl; // std::cout<<"Active detector with det_ID="<<det_ID[i]<<" not found !!!"<<std::endl;
} }
else { else {
// Double_t omega = 851.372*fieldNomVal[0]; // Double_t omega = 851.372*fieldNomVal[0];
Double_t dPhaseShift = (omega==0) ? 0:phaseShiftMap[det_ID[i]]/omega; Double_t dPhaseShift = (omega==0) ? 0:phaseShiftMap[det_ID[i]]/omega;
//cDEL if (det_ID[i]<20) std::cout<<"phaseShift = "<<phaseShiftMap[det_ID[i]]<<" dPhaseShift="<<dPhaseShift<<" tdcresolution="<<tdcresolution<<std::endl; //cDEL if (det_ID[i]<20) std::cout<<"phaseShift = "<<phaseShiftMap[det_ID[i]]<<" dPhaseShift="<<dPhaseShift<<" tdcresolution="<<tdcresolution<<std::endl;
Long64_t timeBin = Long64_t( (globTime+det_time_start[i] )/tdcresolution );
Long64_t timeBin2 = Long64_t( (globTime+det_time_start[i]+dPhaseShift)/tdcresolution ); Double_t t1,t2;
//cDEL if (det_ID[i]<20) std::cout<<" timeBin = "<<timeBin<<" ("<<globTime+det_time_start[i]<<")"<<std::endl; if (bool_muDecayTimeTransformation) {
//cDEL if (det_ID[i]<20) std::cout<<" timeBin2 = "<<timeBin2<<" ("<<globTime+det_time_start[i]+dPhaseShift<<")"<<std::endl; // THIS OPTION WAS SUPOSED TO ALLOW THE USER TO SOMEHOW (IN A TRICKY AND NOT 100% RELIABLE WAY)
// SHIFT THE POSITRON COUNTS TO A RESTRICTED TIME WINDOW, AS IF THE MUON DECAYED IN SOME RESTRICTED
// TIME INTERVAL. THIS, HOWEVER, DOES NOT WORK, IN THE WAY IT IS IMPLEMENTED HERE, BECAUSE THE
// MUON SPIN ROTATION AT REST IS IGNORED HERE - IT WOULD NEED SOME FURTHER WORK TO DO, AND
// BECOMES DIFFICULT TO INTERPRET LATER ==> WORK ON THIS WAS STOPPED.
Double_t diff = muDecayTime_t_max - muDecayTime_t_min;
Double_t ttt1 = det_time_start[i];
if ((ttt1 > muDecayTime_Transformation_min) && (ttt1 < muDecayTime_Transformation_max)) {
if (muDecayTime < muDecayTime_t_min) {
ttt1 = ( Long64_t((muDecayTime_t_min-muDecayTime)/diff)+1) * diff + det_time_start[i];
}
else if (muDecayTime > muDecayTime_t_max) {
ttt1 = ( Long64_t((muDecayTime_t_min-muDecayTime)/diff)) * diff + det_time_start[i];
}
}
t1 = (globTime+ttt1 )/tdcresolution;
t2 = (globTime+ttt1+dPhaseShift)/tdcresolution;
// std::cout<<"DEBUG: det_time_start[i]="<<det_time_start[i]<<" ttt1="<<ttt1<<" t1="<<t1<<" t2="<<t2<<std::endl;
}
else {
t1 = (globTime+det_time_start[i] )/tdcresolution;
t2 = (globTime+det_time_start[i]+dPhaseShift)/tdcresolution;
}
Long64_t timeBin = Long64_t(t1);
Long64_t timeBin2 = Long64_t(t2);
(*it).second->FillHitInCounter(det_edep[i],timeBin,timeBin2,iEn,eventID,i,det_ID[i]); (*it).second->FillHitInCounter(det_edep[i],timeBin,timeBin2,iEn,eventID,i,det_ID[i]);
} }
} }
@ -969,24 +1185,37 @@ Double_t musrAnalysis::PreprocessEvent(Long64_t iEn) {
//================================================================ //================================================================
Bool_t musrAnalysis::PositronCounterHit(Int_t evID, Long64_t dataBinMin, Long64_t dataBinMax, Long64_t& tBin1, Long64_t& tBin2, Int_t& kEntry, Int_t& idetP, Int_t& idetP_ID, Double_t& idetP_edep, Bool_t& doubleHit) { Bool_t musrAnalysis::PositronCounterHit(Int_t evID, Long64_t dataBinMin, Long64_t dataBinMax, Long64_t& tBin1, Long64_t& tBin2, Int_t& kEntry, Int_t& idetP, Int_t& idetP_ID, Double_t& idetP_edep, Bool_t& doubleHit) {
if (bool_debugingRequired) {
if (debugEventMap[eventID]>2) {std::cout<<"DEBUGEVENT:"<<eventID<<"\"PositronCounterHit\": pCounterMap.size()="<<pCounterMap.size()<<std::endl;}
}
if (pCounterMap.empty()) return false; if (pCounterMap.empty()) return false;
Bool_t positronHitFound = false; Bool_t positronHitFound = false;
Bool_t goodPositronFound = false;
if (musrMode=='D') { if (musrMode=='D') {
// Loop over all positron counters // Loop over all positron counters
for (counterMapType::const_iterator it = pCounterMap.begin(); it!=pCounterMap.end(); ++it) { for (counterMapType::const_iterator it = pCounterMap.begin(); it!=pCounterMap.end(); ++it) {
// std::cout<<" ===POSITRON==="<< pCounterMap.size()<<std::endl; // std::cout<<" ===POSITRON==="<< pCounterMap.size()<<std::endl;
// Bool_t thereWasHit = (it->second)->GetNextGoodHitInThisEvent(evID,dataBinMin,dataBinMax,'P',tBin1,kEntry,idetP,idetP_ID,idetP_edep,doubleHit); // Bool_t thereWasHit = (it->second)->GetNextGoodHitInThisEvent(evID,dataBinMin,dataBinMax,'P',tBin1,kEntry,idetP,idetP_ID,idetP_edep,doubleHit);
Bool_t thereWasHit = (it->second)->GetNextGoodPositron(evID,dataBinMin,dataBinMax,tBin1,tBin2,kEntry,idetP,idetP_ID,idetP_edep,doubleHit); // Bool_t thereWasHit = (it->second)->GetNextGoodPositron(evID,dataBinMin,dataBinMax,tBin1,tBin2,kEntry,idetP,idetP_ID,idetP_edep,doubleHit);
Int_t positronQuality = (it->second)->GetNextGoodPositron(evID,dataBinMin,dataBinMax,tBin1,tBin2,kEntry,idetP,idetP_ID,idetP_edep,doubleHit);
// std::cout<<"000000000000 tBin1="<<tBin1<<" tBin2="<<tBin2<<std::endl; // std::cout<<"000000000000 tBin1="<<tBin1<<" tBin2="<<tBin2<<std::endl;
if (doubleHit) {return false;} // There were two hits in the same positron counter if (doubleHit) {return false;} // There were two hits in the same positron counter
if (thereWasHit) { if (positronQuality>0) {
if (positronHitFound) {doubleHit = true; return false;} // There were two hits in two different positron counters if (positronHitFound) {
if (bool_debugingRequired) {
if (debugEventMap[eventID]>2) {std::cout<<"DEBUGEVENT:"<<eventID<<"\"PositronCounterHit\": Coincidence with other positron candidate in other counter."<<std::endl;}
}
doubleHit = true;
return false;
} // There were two hits in two different positron counters
positronHitFound = true; positronHitFound = true;
if (positronQuality>1) goodPositronFound = true;
} }
} }
} }
return positronHitFound; return goodPositronFound;
} }
//================================================================ //================================================================

View File

@ -22,6 +22,13 @@
class musrTH; class musrTH;
//#include "musrSimGlobal.hh"
typedef std::map<int,int> debugEventMapType;
extern debugEventMapType debugEventMap;
extern Bool_t bool_debugingRequired;
class musrAnalysis { class musrAnalysis {
public : public :
TTree *fChain; //!pointer to the analyzed TTree or TChain TTree *fChain; //!pointer to the analyzed TTree or TChain
@ -199,7 +206,10 @@ public :
Double_t gen_time10; Double_t gen_time10;
Double_t det_time10_MINUS_gen_time10; Double_t det_time10_MINUS_gen_time10;
Double_t det_time20; Double_t det_time20;
Double_t pileup_eventID;
Double_t pileup_muDecayDetID_double; Double_t pileup_muDecayDetID_double;
Double_t pileup_muDecayPosZ;
Double_t pileup_muDecayPosR;
typedef std::map<int, Bool_t*> conditionMapType; typedef std::map<int, Bool_t*> conditionMapType;
@ -216,6 +226,18 @@ public :
Bool_t pileupEventCandidate; Bool_t pileupEventCandidate;
Bool_t pileupEvent; Bool_t pileupEvent;
Bool_t goodEvent_det_AND_muonDecayedInSample_gen; Bool_t goodEvent_det_AND_muonDecayedInSample_gen;
Bool_t goodEvent_F_det;
Bool_t goodEvent_B_det;
Bool_t goodEvent_U_det;
Bool_t goodEvent_D_det;
Bool_t goodEvent_L_det;
Bool_t goodEvent_R_det;
Bool_t goodEvent_F_det_AND_pileupEvent;
Bool_t goodEvent_B_det_AND_pileupEvent;
Bool_t goodEvent_U_det_AND_pileupEvent;
Bool_t goodEvent_D_det_AND_pileupEvent;
Bool_t goodEvent_L_det_AND_pileupEvent;
Bool_t goodEvent_R_det_AND_pileupEvent;
musrAnalysis(TTree *tree=0); musrAnalysis(TTree *tree=0);
virtual ~musrAnalysis(); virtual ~musrAnalysis();
@ -234,6 +256,7 @@ public :
virtual void RemoveOldHitsFromCounters(Long64_t timeBinLimit); virtual void RemoveOldHitsFromCounters(Long64_t timeBinLimit);
// virtual void RewindAllTimeInfo(Double_t timeToRewind); // virtual void RewindAllTimeInfo(Double_t timeToRewind);
virtual void RewindAllTimeInfo(Long64_t timeBinsToRewind); virtual void RewindAllTimeInfo(Long64_t timeBinsToRewind);
virtual void PrintHitsInAllCounters();
virtual void InitialiseEvent(); virtual void InitialiseEvent();
virtual Double_t PreprocessEvent(Long64_t iEn); virtual Double_t PreprocessEvent(Long64_t iEn);
virtual Bool_t PositronCounterHit(Int_t evID, Long64_t dataBinMin, Long64_t dataBinMax, Long64_t& tBin1, Long64_t& tBin2, Int_t& kEntry, Int_t& idetP, Int_t& idetP_ID, Double_t& idetP_edep, Bool_t& doubleHit); virtual Bool_t PositronCounterHit(Int_t evID, Long64_t dataBinMin, Long64_t dataBinMax, Long64_t& tBin1, Long64_t& tBin2, Int_t& kEntry, Int_t& idetP, Int_t& idetP_ID, Double_t& idetP_edep, Bool_t& doubleHit);
@ -247,6 +270,10 @@ public :
TH1D* hGeantParameters; TH1D* hGeantParameters;
TH1D* hInfo; TH1D* hInfo;
// typedef std::map<int,int> debugEventMapType;
// debugEventMapType debugEventMap;
// Bool_t bool_debugingRequired;
static const Double_t pi=3.14159265358979324; static const Double_t pi=3.14159265358979324;
private: private:
@ -290,6 +317,8 @@ public :
counterMapType allCounterMap; counterMapType allCounterMap;
Int_t testIVar1; Int_t testIVar1;
Double_t omega; Double_t omega;
Bool_t bool_muDecayTimeTransformation;
Double_t muDecayTime_Transformation_min, muDecayTime_Transformation_max, muDecayTime_t_min, muDecayTime_t_max;
static const Double_t microsecond=1.; static const Double_t microsecond=1.;
static const Double_t nanosecond=0.001; static const Double_t nanosecond=0.001;
@ -327,6 +356,19 @@ private:
typedef std::multimap<Int_t,Int_t> humanDecayMultimapType; typedef std::multimap<Int_t,Int_t> humanDecayMultimapType;
humanDecayMapType humanDecayMap; humanDecayMapType humanDecayMap;
humanDecayMultimapType humanDecayMultimap; humanDecayMultimapType humanDecayMultimap;
typedef std::multimap<int,int> clonedChannelsMultimapType;
clonedChannelsMultimapType clonedChannelsMultimap;
Bool_t bool_clonedChannelsMultimap_NotEmpty;
// List of group of detectors: F,B,U,D,L,R:
std::list <Int_t> F_posCounterList;
std::list <Int_t> B_posCounterList;
std::list <Int_t> U_posCounterList;
std::list <Int_t> D_posCounterList;
std::list <Int_t> L_posCounterList;
std::list <Int_t> R_posCounterList;
// std::list <Int_t>::iterator posCounterList_Iterator;
}; };
#endif #endif
@ -399,7 +441,10 @@ musrAnalysis::musrAnalysis(TTree *tree)
variableMap["det_time10"]=&det_time10; variableMap["det_time10"]=&det_time10;
variableMap["gen_time10"]=&gen_time10; variableMap["gen_time10"]=&gen_time10;
variableMap["det_time10_MINUS_gen_time10"]=&det_time10_MINUS_gen_time10; variableMap["det_time10_MINUS_gen_time10"]=&det_time10_MINUS_gen_time10;
variableMap["pileup_eventID"]=&pileup_eventID;
variableMap["pileup_muDecayDetID"]=&pileup_muDecayDetID_double; variableMap["pileup_muDecayDetID"]=&pileup_muDecayDetID_double;
variableMap["pileup_muDecayPosZ"]=&pileup_muDecayPosZ;
variableMap["pileup_muDecayPosR"]=&pileup_muDecayPosR;
variableMap["det_time20"]=&det_time20; variableMap["det_time20"]=&det_time20;
testIVar1=0; testIVar1=0;
@ -407,6 +452,9 @@ musrAnalysis::musrAnalysis(TTree *tree)
motherOfHumanDecayHistograms=NULL; motherOfHumanDecayHistograms=NULL;
humanDecayPileupHistograms=NULL; humanDecayPileupHistograms=NULL;
motherOfHumanDecayPileupHistograms=NULL; motherOfHumanDecayPileupHistograms=NULL;
bool_muDecayTimeTransformation = false;
bool_clonedChannelsMultimap_NotEmpty = false;
bool_debugingRequired = false;
// if parameter tree is not specified (or zero), connect the file // if parameter tree is not specified (or zero), connect the file
// used to generate this class and read the Tree. // used to generate this class and read the Tree.

View File

@ -2,6 +2,10 @@
#include "musrCounter.hh" #include "musrCounter.hh"
#include "TCanvas.h" #include "TCanvas.h"
typedef std::map<int,int> debugEventMapType;
debugEventMapType debugEventMap;
Bool_t bool_debugingRequired;
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
musrCounter::musrCounter(int CHANNEL_NR, char CHANNEL_NAME[200], char CHANNEL_TYPE, float E_THRESH, int TIME_SHIFT) { musrCounter::musrCounter(int CHANNEL_NR, char CHANNEL_NAME[200], char CHANNEL_TYPE, float E_THRESH, int TIME_SHIFT) {
@ -17,8 +21,12 @@ musrCounter::musrCounter(int CHANNEL_NR, char CHANNEL_NAME[200], char CHANNEL_TY
TDC_t1=0; TDC_t1=0;
TDC_t2=0; TDC_t2=0;
TDC_histoNrAdd=0; TDC_histoNrAdd=0;
coincidenceTimeWindowMin=0; antiCoincidenceTimeWindowMin=0;
coincidenceTimeWindowMax=0; antiCoincidenceTimeWindowMax=0;
coincidenceTimeWindowMin_M=0;
coincidenceTimeWindowMax_M=0;
coincidenceTimeWindowMin_P=0;
coincidenceTimeWindowMax_P=0;
maxCoincidenceTimeWindow=0; maxCoincidenceTimeWindow=0;
strcpy(TDC_histoNameAdd,"Unset"); strcpy(TDC_histoNameAdd,"Unset");
doubleHitN=0; doubleHitN=0;
@ -74,7 +82,7 @@ void musrCounter::RemoveHitsInCounter(Long64_t timeBinLimit) {
// myPrintThisCounter(); // myPrintThisCounter();
// if (counterNr==1) {std::cout<<"ooooo1 timeBinLimit="<<timeBinLimit<<std::endl; myPrintThisCounter();} // if (counterNr==1) {std::cout<<"ooooo1 timeBinLimit="<<timeBinLimit<<std::endl; myPrintThisCounter();}
for (hitMap_TYPE::iterator it = hitMap.begin(); it != hitMap.end(); ++it) { for (hitMap_TYPE::iterator it = hitMap.begin(); it != hitMap.end(); ++it) {
// std::cout<<"musrCounter::RemoveHitsInCounter: counterNr="<<counterNr<<" hitMap.size()="<<hitMap.size()<<" maxCoincidenceTimeWindow="<<maxCoincidenceTimeWindow<<" bins of tdcresolution."<<std::endl; // std::cout<<" musrCounter::RemoveHitsInCounter: counterNr="<<counterNr<<" timeBinLimit="<<timeBinLimit<<" maxCoincidenceTimeWindow="<<maxCoincidenceTimeWindow<<" counterTimeShift="<<counterTimeShift<<std::endl;
if ((it->first)>(timeBinLimit+maxCoincidenceTimeWindow-counterTimeShift)) return; //note that maxCoincidenceTimeWindow is usually negative number if ((it->first)>(timeBinLimit+maxCoincidenceTimeWindow-counterTimeShift)) return; //note that maxCoincidenceTimeWindow is usually negative number
else { else {
// std::cout<<" Deleting hit from counter "<<counterNr<<", time bin = "<<(it->first)<<std::endl; // std::cout<<" Deleting hit from counter "<<counterNr<<", time bin = "<<(it->first)<<std::endl;
@ -104,19 +112,31 @@ void musrCounter::RewindHitsInCounter(Long64_t timeBinsToRewind) {
} }
//================================================================ //================================================================
Bool_t musrCounter::IsInCoincidence(Long64_t timeBin, Bool_t ignoreHitsAtBinZero, Long64_t timeBinMinimum, Long64_t timeBinMaximum){ Bool_t musrCounter::IsInCoincidence(Long64_t timeBin, char motherCounter, Bool_t ignoreHitsAtBinZero, Long64_t timeBinMinimum, Long64_t timeBinMaximum){
// timeBin ... time bin, at which the coincidence is searched // timeBin ... time bin, at which the coincidence is searched
// counterTimeShiftOfRequestingCounter ... time shift (in bin units) of the counter, for which the coincidence is searched // counterTimeShiftOfRequestingCounter ... time shift (in bin units) of the counter, for which the coincidence is searched
// ignoreHitsAtBinZero ... if "true", hits at timeBin will be ignored (needed for searching of coincidence of M counter // ignoreHitsAtBinZero ... if "true", hits at timeBin will be ignored (needed for searching of coincidence of M counter
// with other M counters or P counters with other P counters) // with other M counters or P counters with other P counters)
// "false" should be used for coincidence detectors and vetos. // "false" should be used for coincidence detectors and vetos.
if (hitMap.empty()) return false; if (hitMap.empty()) return false;
// Long64_t timeBinToTest = timeBin + counterTimeShift - counterTimeShiftOfRequestingCounter; // Long64_t timeBinToTest = timeBin;
Long64_t timeBinToTest = timeBin; Long64_t timeBinMin;
Long64_t timeBinMax;
// If timeBinMinimum and timeBinMaximum are not specified, use internal time window of the detector (koincidence or veto detectors). // If timeBinMinimum and timeBinMaximum are not specified, use internal time window of the detector (koincidence or veto detectors).
// Otherwise use timeBinMinimum and timeBinMaximum (e.g.coincidence of a positron counter with other positron counters). // Otherwise use timeBinMinimum and timeBinMaximum (e.g.coincidence of a positron counter with other positron counters).
Long64_t timeBinMin = (timeBinMinimum==-123456789) ? timeBinToTest + coincidenceTimeWindowMin : timeBinToTest + timeBinMinimum; if (timeBinMinimum!=-123456789) timeBinMin = timeBin + timeBinMinimum; // time window requested through "timeBinMinimum"
Long64_t timeBinMax = (timeBinMaximum==-123456789) ? timeBinToTest + coincidenceTimeWindowMax : timeBinToTest + timeBinMaximum; else if (counterType == 'V') timeBinMin = timeBin + antiCoincidenceTimeWindowMin; // this is veto detector
else if (motherCounter=='M') timeBinMin = timeBin + coincidenceTimeWindowMin_M; // this is coinc. detector (or M counter) connected to M
else if (motherCounter=='P') timeBinMin = timeBin + coincidenceTimeWindowMin_P; // this is coinc. detector connected to P
if (timeBinMaximum!=-123456789) timeBinMax = timeBin + timeBinMaximum; // time window requested through "timeBinMinimum"
else if (counterType == 'V') timeBinMax = timeBin + antiCoincidenceTimeWindowMax; // this is veto detector
else if (motherCounter=='M') timeBinMax = timeBin + coincidenceTimeWindowMax_M; // this is coinc. detector (or M counter) connected to M
else if (motherCounter=='P') timeBinMax = timeBin + coincidenceTimeWindowMax_P; // this is coinc. detector connected to P
// Long64_t timeBinMin = (timeBinMinimum==-123456789) ? timeBin + coincidenceTimeWindowMin : timeBin + timeBinMinimum;
// Long64_t timeBinMax = (timeBinMaximum==-123456789) ? timeBin + coincidenceTimeWindowMax : timeBin + timeBinMaximum;
for (hitMap_TYPE::iterator it = hitMap.begin(); it != hitMap.end(); ++it) { for (hitMap_TYPE::iterator it = hitMap.begin(); it != hitMap.end(); ++it) {
Long64_t timeBinOfCount_tmp = it->first; Long64_t timeBinOfCount_tmp = it->first;
if ((timeBinOfCount_tmp >= timeBinMin) && (timeBinOfCount_tmp <= timeBinMax)) { if ((timeBinOfCount_tmp >= timeBinMin) && (timeBinOfCount_tmp <= timeBinMax)) {
@ -157,17 +177,14 @@ Bool_t musrCounter::GetNextGoodMuon(Int_t evtID, Long64_t timeBinMin, Long64_t&
// std::cout<<"*** "<<evtID<<" eventNumber="<<eventNumber<<" canditas="<<numberOfMuonCandidates<<std::endl; // std::cout<<"*** "<<evtID<<" eventNumber="<<eventNumber<<" canditas="<<numberOfMuonCandidates<<std::endl;
// Hit candidate was found. Now check its coincidences and vetos // Hit candidate was found. Now check its coincidences and vetos
for (counterMapType::const_iterator itCounter = koincidenceCounterMap.begin(); itCounter!=koincidenceCounterMap.end(); ++itCounter) { for (counterMapType::const_iterator itCounter = koincidenceCounterMap.begin(); itCounter!=koincidenceCounterMap.end(); ++itCounter) {
// if (!( (itCounter->second)->IsInCoincidence(timeBinOfCount_tmp,counterTimeShift) )) goto endOfThisHit; // no coincidence found ==> skip hit if (!( (itCounter->second)->IsInCoincidence(timeBinOfCount_tmp,'M') )) goto endOfThisHit; // no coincidence found ==> skip hit
if (!( (itCounter->second)->IsInCoincidence(timeBinOfCount_tmp) )) goto endOfThisHit; // no coincidence found ==> skip hit
} }
for (counterMapType::const_iterator itCounter = vetoCounterMap.begin(); itCounter!=vetoCounterMap.end(); ++itCounter) { for (counterMapType::const_iterator itCounter = vetoCounterMap.begin(); itCounter!=vetoCounterMap.end(); ++itCounter) {
// if ( (itCounter->second)->IsInCoincidence(timeBinOfCount_tmp,counterTimeShift) ) goto endOfThisHit; // coincidence with veto found ==> skip hit if ( (itCounter->second)->IsInCoincidence(timeBinOfCount_tmp,'M') ) goto endOfThisHit; // coincidence with veto found ==> skip hit
if ( (itCounter->second)->IsInCoincidence(timeBinOfCount_tmp) ) goto endOfThisHit; // coincidence with veto found ==> skip hit
} }
// Check coincidences with other hits in the M counter // Check coincidences with other hits in the M counter
// it is expected that there is only one M counter // it is expected that there is only one M counter
// if (this->IsInCoincidence(timeBinOfCount_tmp,counterTimeShift,true) ) { // coincidence with another M-counter hit ==> skip hit if (this->IsInCoincidence(timeBinOfCount_tmp,'M',true) ) { // coincidence with another M-counter hit ==> skip hit
if (this->IsInCoincidence(timeBinOfCount_tmp,true) ) { // coincidence with another M-counter hit ==> skip hit
doubleHitFound = true; doubleHitFound = true;
// std::cout<<"UJGUR double hit found"<<std::endl; // std::cout<<"UJGUR double hit found"<<std::endl;
goto endOfThisHit; goto endOfThisHit;
@ -187,35 +204,58 @@ Bool_t musrCounter::GetNextGoodMuon(Int_t evtID, Long64_t timeBinMin, Long64_t&
} }
//================================================================ //================================================================
Bool_t musrCounter::GetNextGoodPositron(Int_t evtID, Long64_t timeBinMin, Long64_t timeBinMax, Long64_t& timeBinOfNextGoodHit, Long64_t& timeBinOfNextGoodHit_phaseShifted, Int_t& kEntry, Int_t& idet, Int_t& idetID, Double_t& idetEdep, Bool_t& doubleHitFound) { Int_t musrCounter::GetNextGoodPositron(Int_t evtID, Long64_t timeBinMin, Long64_t timeBinMax, Long64_t& timeBinOfNextGoodHit, Long64_t& timeBinOfNextGoodHit_phaseShifted, Int_t& kEntry, Int_t& idet, Int_t& idetID, Double_t& idetEdep, Bool_t& doubleHitFound) {
// INPUT PARAMETERS: evtID, timeBinMin // INPUT PARAMETERS: evtID, timeBinMin
// OUTPUT PARAMETERS: timeBinOfNextGoodHit // OUTPUT PARAMETERS: timeBinOfNextGoodHit
// // positronQuality = 0 ... no positron candidate found
// = 1 ... positron candidate found, but vetoed or not in a required coincidence with other detector
// = 2 ... good positron found
// Loop over the hits in the counter // Loop over the hits in the counter
if (hitMap.empty()) return false; Int_t positronQuality=0;
if (bool_debugingRequired) {if (debugEventMap[evtID]>4) myPrintThisCounter(evtID);}
if (hitMap.empty()) return 0;
if (counterType!='P') {std::cout<<"\n!!! FATAL ERROR !!! musrCounter::GetNextGoodPositron: not the positron counter! ==> S T O P !!!\n"; exit(1);} if (counterType!='P') {std::cout<<"\n!!! FATAL ERROR !!! musrCounter::GetNextGoodPositron: not the positron counter! ==> S T O P !!!\n"; exit(1);}
doubleHitFound = false; doubleHitFound = false;
for (hitMap_TYPE::iterator it = hitMap.begin(); it != hitMap.end(); ++it) { for (hitMap_TYPE::iterator it = hitMap.begin(); it != hitMap.end(); ++it) {
Int_t eventNumber = (it->second)->eventIDnumber; Int_t eventNumber = (it->second)->eventIDnumber;
Long64_t timeBinOfCount_tmp = it->first; Long64_t timeBinOfCount_tmp = it->first;
if ((timeBinOfCount_tmp <= timeBinMin) || (timeBinOfCount_tmp > timeBinMax)) continue; // This hit is out of the data interval ==> skip it if ((timeBinOfCount_tmp <= timeBinMin) || (timeBinOfCount_tmp > timeBinMax)) {
if (bool_debugingRequired) {
if (debugEventMap[evtID]>3) {std::cout<<"DEBUGEVENT:"<<evtID<<"\"GetNextGoodPositron\": Hit out of data interval"<<std::endl;}
}
continue; // This hit is out of the data interval ==> skip it
}
// Hit candidate was found. Now check its coincidences and vetos // Hit candidate was found. Now check its coincidences and vetos
positronQuality=1;
for (counterMapType::const_iterator itCounter = koincidenceCounterMap.begin(); itCounter!=koincidenceCounterMap.end(); ++itCounter) { for (counterMapType::const_iterator itCounter = koincidenceCounterMap.begin(); itCounter!=koincidenceCounterMap.end(); ++itCounter) {
// if (!( (itCounter->second)->IsInCoincidence(timeBinOfCount_tmp,counterTimeShift) )) goto endOfThisHit; // no coincidence found ==> skip hit if (bool_debugingRequired) {
if (!( (itCounter->second)->IsInCoincidence(timeBinOfCount_tmp) )) goto endOfThisHit; // no coincidence found ==> skip hit if (debugEventMap[evtID]>4) { (itCounter->second)->myPrintThisCounter(evtID); }
}
if (!( (itCounter->second)->IsInCoincidence(timeBinOfCount_tmp,'P') )) {
if (bool_debugingRequired) {
if (debugEventMap[evtID]>3) {std::cout<<"DEBUGEVENT:"<<evtID<<"\"GetNextGoodPositron\": Coincidence required but not found"<<std::endl;}
}
goto endOfThisHit; // no coincidence found ==> skip hit
}
} }
for (counterMapType::const_iterator itCounter = vetoCounterMap.begin(); itCounter!=vetoCounterMap.end(); ++itCounter) { for (counterMapType::const_iterator itCounter = vetoCounterMap.begin(); itCounter!=vetoCounterMap.end(); ++itCounter) {
// if ( (itCounter->second)->IsInCoincidence(timeBinOfCount_tmp,counterTimeShift) ) goto endOfThisHit; // coincidence with veto found ==> skip hit if ( (itCounter->second)->IsInCoincidence(timeBinOfCount_tmp,'P') ) {
if ( (itCounter->second)->IsInCoincidence(timeBinOfCount_tmp) ) goto endOfThisHit; // coincidence with veto found ==> skip hit if (bool_debugingRequired) {
if (debugEventMap[evtID]>3) {std::cout<<"DEBUGEVENT:"<<evtID<<"\"GetNextGoodPositron\": Coincidence vith veto detector found"<<std::endl;}
}
goto endOfThisHit; // coincidence with veto found ==> skip hit
}
} }
// Check coincidences with other P counters // Check coincidences with other P counters
// Coincidences with other P counters must be checked in musrAnalysis.cxx // Coincidences with other P counters must be checked in musrAnalysis.cxx
// if (this->IsInCoincidence(timeBinOfCount_tmp,counterTimeShift,true) ) { // coincidence with another P-counter hit ==> skip hit //
// hovno
// ADD HERE THE CHECK THAT THE POSITRON IS FOUND WITHIN THE DATA INTERVAL, i.e. within <timeBinMin,timeBinMax>. // ADD HERE THE CHECK THAT THE POSITRON IS FOUND WITHIN THE DATA INTERVAL, i.e. within <timeBinMin,timeBinMax>.
// AND ALSO CHECK THAT THIS IS TRUE FOR THE COINCIDENCE WITH OTHER POSITRON COUNTERS!!! // AND ALSO CHECK THAT THIS IS TRUE FOR THE COINCIDENCE WITH OTHER POSITRON COUNTERS!!!
if (this->IsInCoincidence(timeBinOfCount_tmp,true,timeBinMin,timeBinMax) ) { // coincidence with another P-counter hit ==> skip hit if (this->IsInCoincidence(timeBinOfCount_tmp,'P',true,timeBinMin,timeBinMax) ) { // coincidence with another P-counter hit ==> skip hit
if (bool_debugingRequired) {
if (debugEventMap[evtID]>3) {std::cout<<"DEBUGEVENT:"<<evtID<<"\"GetNextGoodPositron\": Coincidence with other positron candidate in the same counter."<<std::endl;}
}
doubleHitFound = true; doubleHitFound = true;
// std::cout<<"tttttttttttttttttttt doubleHitN="<<doubleHitN++<<std::endl; // std::cout<<"tttttttttttttttttttt doubleHitN="<<doubleHitN++<<std::endl;
goto endOfThisHit; goto endOfThisHit;
@ -227,50 +267,57 @@ Bool_t musrCounter::GetNextGoodPositron(Int_t evtID, Long64_t timeBinMin, Long64
idetEdep = (it->second)->det_edep; idetEdep = (it->second)->det_edep;
timeBinOfNextGoodHit = timeBinOfCount_tmp; timeBinOfNextGoodHit = timeBinOfCount_tmp;
timeBinOfNextGoodHit_phaseShifted = (it->second) -> timeBin2; timeBinOfNextGoodHit_phaseShifted = (it->second) -> timeBin2;
if (bool_debugingRequired) {
if (debugEventMap[evtID]>3) {std::cout<<"DEBUGEVENT:"<<evtID<<"\"GetNextGoodPositron\": Good positron candidate found in this counter."<<std::endl;}
}
//cDEL std::cout<<"timeBinOfNextGoodHit ="<<timeBinOfNextGoodHit<<" timeBinOfNextGoodHit_phaseShifted = "<<timeBinOfNextGoodHit_phaseShifted<<std::endl; //cDEL std::cout<<"timeBinOfNextGoodHit ="<<timeBinOfNextGoodHit<<" timeBinOfNextGoodHit_phaseShifted = "<<timeBinOfNextGoodHit_phaseShifted<<std::endl;
return true; return 2;
endOfThisHit: endOfThisHit:
continue; ;
// continue;
} }
return false; return positronQuality;
} }
//================================================================ //================================================================
void musrCounter::SetCoincidenceTimeWindowOfAllCoincidenceDetectors(Long64_t maxCoinc, Long64_t min, Long64_t max) { void musrCounter::SetCoincidenceTimeWindowOfAllCoincidenceDetectors(char motherCounter, Long64_t maxCoinc, Long64_t min, Long64_t max) {
// std::cout<<"QQQQQQQQQQQQQQQQQQQQQ koincidenceCounterMap.size()="<<koincidenceCounterMap.size()<<std::endl;
for (counterMapType::const_iterator it = koincidenceCounterMap.begin(); it!=koincidenceCounterMap.end(); ++it) { for (counterMapType::const_iterator it = koincidenceCounterMap.begin(); it!=koincidenceCounterMap.end(); ++it) {
if ( ( ((it->second)->GetMaxCoincidenceTimeWindow()) !=0) && Long64_t maxCoinc_AlreadySet = ((it->second)->GetMaxCoincidenceTimeWindow());
( ((it->second)->GetMaxCoincidenceTimeWindow()) !=maxCoinc) ) { if (maxCoinc < maxCoinc_AlreadySet) (it->second)->SetMaxCoincidenceTimeWindow(maxCoinc);
std::cout<<" !!!! ERROR SetCoincidenceTimeWindowOfAllCoincidenceDetectors : coincidenceTimeWindow set multiple times! ==> S T O P !!!"<<std::endl;
if (motherCounter=='M') (it->second)->SetCoincidenceTimeWindow_M(min,max);
else if (motherCounter=='P') (it->second)->SetCoincidenceTimeWindow_P(min,max);
else {
std::cout<<"musrCounter::SetCoincidenceTimeWindowOfAllCoincidenceDetectors ERROR: Strange motherCounter "
<<motherCounter<<"\n ==> S T O P "<<std::endl;
exit(1); exit(1);
} }
(it->second)->SetMaxCoincidenceTimeWindow(maxCoinc);
(it->second)->SetCoincidenceTimeWindow(min,max);
} }
} }
//================================================================ //================================================================
void musrCounter::SetCoincidenceTimeWindowOfAllVetoDetectors(Long64_t maxCoinc, Long64_t min, Long64_t max) { void musrCounter::SetCoincidenceTimeWindowOfAllVetoDetectors(Long64_t maxCoinc, Long64_t min, Long64_t max) {
for (counterMapType::const_iterator it = vetoCounterMap.begin(); it!=vetoCounterMap.end(); ++it) { for (counterMapType::const_iterator it = vetoCounterMap.begin(); it!=vetoCounterMap.end(); ++it) {
if ( ( ((it->second)->GetMaxCoincidenceTimeWindow()) !=0) && Long64_t maxCoinc_AlreadySet = ((it->second)->GetMaxCoincidenceTimeWindow());
( ((it->second)->GetMaxCoincidenceTimeWindow()) !=maxCoinc) ) { if (maxCoinc < maxCoinc_AlreadySet) (it->second)->SetMaxCoincidenceTimeWindow(maxCoinc);
std::cout<<" !!!! ERROR SetCoincidenceTimeWindowOfAllVetoDetectors : coincidenceTimeWindow set multiple times! ==> S T O P !!!"<<std::endl;
exit(1); (it->second)->SetAntiCoincidenceTimeWindow(min,max);
}
(it->second)->SetMaxCoincidenceTimeWindow(maxCoinc);
(it->second)->SetCoincidenceTimeWindow(min,max);
} }
} }
//================================================================ //================================================================
void musrCounter::myPrintThisCounter(Int_t evtID) { void musrCounter::myPrintThisCounter(Int_t evtID, Int_t detail) {
Bool_t eventMixing=false; Bool_t eventMixing=false;
std::cout<<"musrCounter::myPrintThisCounter: counterNr="<<counterNr<<": "; if ((hitMap.begin()==hitMap.end()) && (detail<=1) ) return;
if (detail>1) std::cout<<"musrCounter::myPrintThisCounter: counterNr = "<<counterNr<<": ";
else std::cout<<" counter = "<<counterNr<<": ";
for (hitMap_TYPE::iterator it = hitMap.begin(); it != hitMap.end(); ++it) { for (hitMap_TYPE::iterator it = hitMap.begin(); it != hitMap.end(); ++it) {
std::cout<<"\t"<<it->first<<" "<<(it->second)->eventIDnumber<<","; std::cout<<"\t"<<it->first<<" "<<(it->second)->eventIDnumber<<",";
if (evtID != (it->second)->eventIDnumber) {eventMixing=true;} if (evtID != (it->second)->eventIDnumber) {eventMixing=true;}
} }
if (eventMixing) {std::cout<<" Potential event mmmmmmmmixing";} if (eventMixing) {std::cout<<" Potential event mixing";}
std::cout<<std::endl; std::cout<<std::endl;
} }

View File

@ -18,6 +18,11 @@ public:
Int_t det_id; Int_t det_id;
Double_t det_edep; Double_t det_edep;
Long64_t timeBin2; Long64_t timeBin2;
// extern double GlobalKamil;
// typedef std::map<int,int> debugEventMapType;
// extern debugEventMapType debugEventMap;
// extern Bool_t bool_debugingRequired;
}; };
class musrCounter { class musrCounter {
@ -39,19 +44,21 @@ class musrCounter {
} }
void SetMaxCoincidenceTimeWindow(Long64_t val) {maxCoincidenceTimeWindow=val;} void SetMaxCoincidenceTimeWindow(Long64_t val) {maxCoincidenceTimeWindow=val;}
Long64_t GetMaxCoincidenceTimeWindow() {return maxCoincidenceTimeWindow;} Long64_t GetMaxCoincidenceTimeWindow() {return maxCoincidenceTimeWindow;}
void SetCoincidenceTimeWindowOfAllCoincidenceDetectors(Long64_t maxCoinc, Long64_t min, Long64_t max); void SetCoincidenceTimeWindowOfAllCoincidenceDetectors(char motherCounter, Long64_t maxCoinc, Long64_t min, Long64_t max);
void SetCoincidenceTimeWindowOfAllVetoDetectors(Long64_t maxCoinc, Long64_t min, Long64_t max); void SetCoincidenceTimeWindowOfAllVetoDetectors(Long64_t maxCoinc, Long64_t min, Long64_t max);
void SetCoincidenceTimeWindow(Long64_t min, Long64_t max) {coincidenceTimeWindowMin=min; coincidenceTimeWindowMax=max;} void SetCoincidenceTimeWindow_M(Long64_t min, Long64_t max) {coincidenceTimeWindowMin_M=min; coincidenceTimeWindowMax_M=max;}
void SetCoincidenceTimeWindow_P(Long64_t min, Long64_t max) {coincidenceTimeWindowMin_P=min; coincidenceTimeWindowMax_P=max;}
void SetAntiCoincidenceTimeWindow(Long64_t min, Long64_t max) {antiCoincidenceTimeWindowMin=min; antiCoincidenceTimeWindowMax=max;}
void SetTDChistogram(char hName[200],int t0,int t1,int t2,int hNr,char hNameAdd[200]); void SetTDChistogram(char hName[200],int t0,int t1,int t2,int hNr,char hNameAdd[200]);
void FillTDChistogram(Double_t variable, Double_t vaha); void FillTDChistogram(Double_t variable, Double_t vaha);
void DrawTDChistogram(); void DrawTDChistogram();
void FillHitInCounter(Double_t edep, Long64_t timeBin, Long64_t timeBin2, Int_t kEntry, Int_t eveID, Int_t iDet, Int_t detectorID); void FillHitInCounter(Double_t edep, Long64_t timeBin, Long64_t timeBin2, Int_t kEntry, Int_t eveID, Int_t iDet, Int_t detectorID);
void RemoveHitsInCounter(Long64_t timeBinLimit); void RemoveHitsInCounter(Long64_t timeBinLimit);
void RewindHitsInCounter(Long64_t timeBinsToRewind); void RewindHitsInCounter(Long64_t timeBinsToRewind);
Bool_t IsInCoincidence(Long64_t timeBin, Bool_t ignoreHitsAtBinZero=false, Long64_t timeBinMinimum=-123456789, Long64_t timeBinMaximum=-123456789); Bool_t IsInCoincidence(Long64_t timeBin, char motherCounter, Bool_t ignoreHitsAtBinZero=false, Long64_t timeBinMinimum=-123456789, Long64_t timeBinMaximum=-123456789);
Bool_t GetNextGoodMuon(Int_t evtID, Long64_t timeBinMin, Long64_t& timeBinOfNextHit, Int_t& kEntry, Int_t& idet, Int_t& idetID, Double_t& idetEdep, Bool_t& doubleHitFound); Bool_t GetNextGoodMuon(Int_t evtID, Long64_t timeBinMin, Long64_t& timeBinOfNextHit, Int_t& kEntry, Int_t& idet, Int_t& idetID, Double_t& idetEdep, Bool_t& doubleHitFound);
Bool_t GetNextGoodPositron(Int_t evtID, Long64_t timeBinMin, Long64_t timeBinMax, Long64_t& timeBinOfNextGoodHit, Long64_t& timeBinOfNextGoodHit_phaseShifted, Int_t& kEntry, Int_t& idet, Int_t& idetID, Double_t& idetEdep, Bool_t& doubleHitFound); Int_t GetNextGoodPositron(Int_t evtID, Long64_t timeBinMin, Long64_t timeBinMax, Long64_t& timeBinOfNextGoodHit, Long64_t& timeBinOfNextGoodHit_phaseShifted, Int_t& kEntry, Int_t& idet, Int_t& idetID, Double_t& idetEdep, Bool_t& doubleHitFound);
void myPrintThisCounter(Int_t evtID); void myPrintThisCounter(Int_t evtID, Int_t detail=2);
Long64_t GetNumberOfMuonCandidates(){return numberOfMuonCandidates;} Long64_t GetNumberOfMuonCandidates(){return numberOfMuonCandidates;}
@ -69,8 +76,8 @@ class musrCounter {
int TDC_t0, TDC_t1, TDC_t2, TDC_histoNrAdd; int TDC_t0, TDC_t1, TDC_t2, TDC_histoNrAdd;
char TDC_histoNameAdd[200]; char TDC_histoNameAdd[200];
TH1D* histTDC; TH1D* histTDC;
Long64_t coincidenceTimeWindowMin; Long64_t antiCoincidenceTimeWindowMin, coincidenceTimeWindowMin_M, coincidenceTimeWindowMin_P;
Long64_t coincidenceTimeWindowMax; Long64_t antiCoincidenceTimeWindowMax, coincidenceTimeWindowMax_M, coincidenceTimeWindowMax_P;
Long64_t maxCoincidenceTimeWindow; Long64_t maxCoincidenceTimeWindow;
// typedef std::map<Long64_t,Int_t> hitMap_TYPE; // Long64_t = timeBin, Int_t=eventID // typedef std::map<Long64_t,Int_t> hitMap_TYPE; // Long64_t = timeBin, Int_t=eventID
typedef std::map<Long64_t,hitInfo*> hitMap_TYPE; // Long64_t = timeBin, hitInfo = eventID and det_i typedef std::map<Long64_t,hitInfo*> hitMap_TYPE; // Long64_t = timeBin, hitInfo = eventID and det_i

View File

@ -47,7 +47,8 @@ void musrTH::FillTH1D(Double_t vaha, Bool_t* cond){
for (Int_t i=0; i<musrAnalysis::nrConditions; i++) { for (Int_t i=0; i<musrAnalysis::nrConditions; i++) {
if (bool_rotating_reference_frame) { if (bool_rotating_reference_frame) {
// Double_t var = *variableToBeFilled_X; // Double_t var = *variableToBeFilled_X;
if (cond[i]) histArray1D[i]->Fill(*variableToBeFilled_X,vaha*cos(2*musrAnalysis::pi*rot_ref_frequency*(*variableToBeFilled_X)+rot_ref_phase)); Double_t waha = vaha*exp((*variableToBeFilled_X)/2.19703)*cos(2*musrAnalysis::pi*rot_ref_frequency*(*variableToBeFilled_X)+rot_ref_phase);
if (cond[i]) histArray1D[i]->Fill(*variableToBeFilled_X,waha);
} }
else { else {
if (cond[i]) histArray1D[i]->Fill(*variableToBeFilled_X,vaha); if (cond[i]) histArray1D[i]->Fill(*variableToBeFilled_X,vaha);
@ -223,7 +224,7 @@ void musrTH::FitHistogramsIfRequired(Double_t omega) {
for (Int_t i=0; i<musrAnalysis::nrConditions; i++) { for (Int_t i=0; i<musrAnalysis::nrConditions; i++) {
// std::cout<<"fitted histogram pointer="<<histArray1D[i]<<std::endl; // std::cout<<"fitted histogram pointer="<<histArray1D[i]<<std::endl;
histArray1D[i]->Fit(funct,"","",funct_xMin,funct_xMax); histArray1D[i]->Fit(funct,"WW","",funct_xMin,funct_xMax);
// histArray1D[i]->Fit(funct,"LL","",funct_xMin,funct_xMax); // histArray1D[i]->Fit(funct,"LL","",funct_xMin,funct_xMax);
} }
// if (strcmp(funct->GetName(),"simpleExpoPLUSconst")==0) { // if (strcmp(funct->GetName(),"simpleExpoPLUSconst")==0) {

View File

@ -64,6 +64,9 @@
#include "G4RegionStore.hh" #include "G4RegionStore.hh"
#include "G4ProductionCuts.hh" #include "G4ProductionCuts.hh"
//#include "G4OpticalSurface.hh"
#include "G4LogicalBorderSurface.hh"
#include "musrRootOutput.hh" //cks for storing some info in the Root output file #include "musrRootOutput.hh" //cks for storing some info in the Root output file
#include "musrParameters.hh" #include "musrParameters.hh"
#include "musrErrorMessage.hh" #include "musrErrorMessage.hh"
@ -71,9 +74,10 @@
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
musrDetectorConstruction::musrDetectorConstruction() musrDetectorConstruction::musrDetectorConstruction(G4String steeringFileName)
:parameterFileName("Unset"), checkOverlap(true), aScintSD(0) :checkOverlap(true), aScintSD(0)
{ {
parameterFileName = steeringFileName;
DefineMaterials(); DefineMaterials();
detectorMessenger = new musrDetectorMessenger(this); detectorMessenger = new musrDetectorMessenger(this);
} }
@ -102,7 +106,9 @@ G4VPhysicalVolume* musrDetectorConstruction::Construct() {
// G4double roundingErr=0.01*mm; // 0.01mm precision is OK for displaying subtracted volumes, while 0.001mm is not // G4double roundingErr=0.01*mm; // 0.01mm precision is OK for displaying subtracted volumes, while 0.001mm is not
//---------------------- //----------------------
musrRootOutput* myRootOutput = musrRootOutput::GetRootInstance(); musrRootOutput* myRootOutput = musrRootOutput::GetRootInstance();
musrSteppingAction* mySteppingAction = musrSteppingAction::GetInstance();
G4VPhysicalVolume* pointerToWorldVolume=NULL; G4VPhysicalVolume* pointerToWorldVolume=NULL;
// Read detector configuration parameters from the steering file: // Read detector configuration parameters from the steering file:
@ -483,7 +489,6 @@ G4VPhysicalVolume* musrDetectorConstruction::Construct() {
if (strstr(name,"save")!=NULL) { if (strstr(name,"save")!=NULL) {
if (volumeID!=0) { // do not store hits in special "save" volume if ID of this volume is 0 if (volumeID!=0) { // do not store hits in special "save" volume if ID of this volume is 0
// (due to difficulties to distinguish between ID=0 and no save volume when using std::map) // (due to difficulties to distinguish between ID=0 and no save volume when using std::map)
musrSteppingAction* mySteppingAction = musrSteppingAction::GetInstance();
mySteppingAction->SetLogicalVolumeAsSpecialSaveVolume(logicName,volumeID); mySteppingAction->SetLogicalVolumeAsSpecialSaveVolume(logicName,volumeID);
musrRootOutput::GetRootInstance()->SetSpecialSaveVolumeDefined(); musrRootOutput::GetRootInstance()->SetSpecialSaveVolumeDefined();
} }
@ -562,6 +567,164 @@ G4VPhysicalVolume* musrDetectorConstruction::Construct() {
} }
} }
// cks: Optical Boundary (needed only when simulating optical photons)
else if (strcmp(tmpString1,"opticalSurface")==0) {
if (musrParameters::boolG4OpticalPhotons) {
char optSurfaceName[100];
char physVolName1[100];
char physVolName2[100];
char type[100];
char finish[100];
char model[100];
char materialPropertiesTableName[100]="Undefined";
sscanf(&line[0],"%*s %*s %s %s %s %s %s %s %s",optSurfaceName,physVolName1,physVolName2,type,finish,model,materialPropertiesTableName);
G4VPhysicalVolume* pPhysVol1 = FindPhysicalVolume(physVolName1);
G4VPhysicalVolume* pPhysVol2 = FindPhysicalVolume(physVolName2);
if ((pPhysVol1==NULL)||(pPhysVol2==NULL)) {
G4cout << "ERROR! musrDetectorConstruction::Construct(): Physical Volume not found!"<<G4endl;
G4cout << " ==> S T O P F O R C E D"<<G4endl;
ReportGeometryProblem(line);
exit(1);
}
G4OpticalSurface* optSurfTMP = new G4OpticalSurface(optSurfaceName);
new G4LogicalBorderSurface(optSurfaceName,pPhysVol1,pPhysVol2,optSurfTMP);
std::map<std::string,G4SurfaceType> OpticalTypeMap;
std::map<std::string,G4OpticalSurfaceModel> OpticalModelMap;
std::map<std::string,G4OpticalSurfaceFinish> OpticalFinishMap;
OpticalTypeMap["dielectric_metal"]=dielectric_metal; // dielectric-metal interface
OpticalTypeMap["dielectric_dielectric"]=dielectric_dielectric; // dielectric-dielectric interface
OpticalTypeMap["dielectric_LUT"]=dielectric_LUT; // dielectric-Look-Up-Table interface
OpticalTypeMap["firsov"]=firsov; // for Firsov Process
OpticalTypeMap["x_ray"]=x_ray; // for x-ray mirror process
OpticalModelMap["glisur"]=glisur; // original GEANT3 model
OpticalModelMap["unified"]=unified; // UNIFIED model
OpticalModelMap["LUT"]=LUT; // Look-Up-Table model
OpticalFinishMap["polished"]=polished; // smooth perfectly polished surface
OpticalFinishMap["polishedfrontpainted"]=polishedfrontpainted; // smooth top-layer (front) paint
OpticalFinishMap["polishedbackpainted"]=polishedbackpainted; // same is 'polished' but with a back-paint
OpticalFinishMap["ground"]=ground; // rough surface
OpticalFinishMap["groundfrontpainted"]=groundfrontpainted; // rough top-layer (front) paint
OpticalFinishMap["groundbackpainted"]=groundbackpainted; // same as 'ground' but with a back-paint
OpticalFinishMap["polishedlumirrorair"]=polishedlumirrorair; // mechanically polished surface, with lumirror
OpticalFinishMap["polishedlumirrorglue"]=polishedlumirrorglue; // mechanically polished surface, with lumirror & meltmount
OpticalFinishMap["polishedair"]=polishedair; // mechanically polished surface
OpticalFinishMap["polishedteflonair"]=polishedteflonair; // mechanically polished surface, with teflon
OpticalFinishMap["polishedtioair"]=polishedtioair; // mechanically polished surface, with tio paint
OpticalFinishMap["polishedtyvekair"]=polishedtyvekair; // mechanically polished surface, with tyvek
OpticalFinishMap["polishedvm2000air"]=polishedvm2000air; // mechanically polished surface, with esr film
OpticalFinishMap["polishedvm2000glue"]=polishedvm2000glue; // mechanically polished surface, with esr film & meltmount
OpticalFinishMap["etchedlumirrorair"]=etchedlumirrorair; // chemically etched surface, with lumirror
OpticalFinishMap["etchedlumirrorglue"]=etchedlumirrorglue; // chemically etched surface, with lumirror & meltmount
OpticalFinishMap["etchedair"]=etchedair; // chemically etched surface
OpticalFinishMap["etchedteflonair"]=etchedteflonair; // chemically etched surface, with teflon
OpticalFinishMap["etchedtioair"]=etchedtioair; // chemically etched surface, with tio paint
OpticalFinishMap["etchedtyvekair"]=etchedtyvekair; // chemically etched surface, with tyvek
OpticalFinishMap["etchedvm2000air"]=etchedvm2000air; // chemically etched surface, with esr film
OpticalFinishMap["etchedvm2000glue"]=etchedvm2000glue; // chemically etched surface, with esr film & meltmount
OpticalFinishMap["groundlumirrorair"]=groundlumirrorair; // rough-cut surface, with lumirror
OpticalFinishMap["groundlumirrorglue"]=groundlumirrorglue; // rough-cut surface, with lumirror & meltmount
OpticalFinishMap["groundair"]=groundair; // rough-cut surface
OpticalFinishMap["groundteflonair"]=groundteflonair; // rough-cut surface, with teflon
OpticalFinishMap["groundtioair"]=groundtioair; // rough-cut surface, with tio paint
OpticalFinishMap["groundtyvekair"]=groundtyvekair; // rough-cut surface, with tyvek
OpticalFinishMap["groundvm2000air"]=groundvm2000air; // rough-cut surface, with esr film
OpticalFinishMap["groundvm2000glue"]=groundvm2000glue; // rough-cut surface, with esr film & meltmount
G4SurfaceType OpticalType = OpticalTypeMap[type];
G4OpticalSurfaceModel OpticalModel = OpticalModelMap[model];
G4OpticalSurfaceFinish OpticalFinish = OpticalFinishMap[finish];
if ((OpticalType==0)&&(strcmp(type,"dielectric_metal")!=0)) {
G4cout<<"ERROR! musrDetectorConstruction::Construct(): Optical type \""<<type<<"\" not found!"<<G4endl;
G4cout << " ==> S T O P F O R C E D"<<G4endl;
G4cout<<" "<<line;
exit(1);
}
if ((OpticalModel==0)&&(strcmp(model,"glisur")!=0)) {
G4cout<<"ERROR! musrDetectorConstruction::Construct(): Optical surface model \""<<model<<"\" not found!"<<G4endl;
G4cout << " ==> S T O P F O R C E D"<<G4endl;
G4cout<<" "<<line;
exit(1);
}
if ((OpticalFinish==0)&&(strcmp(finish,"polished")!=0)) {
G4cout<<"ERROR! musrDetectorConstruction::Construct(): Optical surface finish \""<<finish<<"\" not found!"<<G4endl;
G4cout << " ==> S T O P F O R C E D"<<G4endl;
G4cout<<" "<<line;
exit(1);
}
optSurfTMP->SetType(OpticalType);
optSurfTMP->SetFinish(OpticalFinish);
optSurfTMP->SetModel(OpticalModel);
// Assign the "Material properties table" if required by the user:
G4cout<<"materialPropertiesTableName="<<materialPropertiesTableName<<G4endl;
if (strcmp(materialPropertiesTableName,"Undefined")!=0) {
G4MaterialPropertiesTable* MPT_tmp=NULL;
itMPT = materialPropertiesTableMap.find(materialPropertiesTableName);
if (itMPT==materialPropertiesTableMap.end()) { // G4MaterialPropertiesTable of this name does not exist --> problem
G4cout<<"\n\n musrDetectorConstruction(): Material Properties Table \""<<materialPropertiesTableName
<<"\" should be assigned to G4OpticalSurface \""<<optSurfaceName<<"\""<<G4endl;
G4cout<<" but the table was not defined yet (by command /musr/command materialPropertiesTable )"<<G4endl;
G4cout << "S T O P F O R C E D"<<G4endl;
G4cout << line << G4endl;
exit(1);
}
else {
MPT_tmp = itMPT->second;
}
optSurfTMP->SetMaterialPropertiesTable(MPT_tmp);
G4cout<<optSurfTMP<<G4endl;
optSurfTMP->GetMaterialPropertiesTable()->DumpTable();
}
G4cout<<"Optical surface \""<<optSurfaceName<<"\" created. OpticalType="<<OpticalType
<<" OpticalFinish="<<OpticalFinish<<" OpticalModel="<<OpticalModel<<G4endl;
}
}
else if (strcmp(tmpString1,"OPSA")==0){ // optical photon signal analysis
if (musrParameters::boolG4OpticalPhotons) {
musrScintSD* myMusrScintSD = musrScintSD::GetInstance();
if (myMusrScintSD==NULL) {
sprintf(eMessage,"musrDetectorConstruction.cc::Construct(): musrScintSD::GetInstance() is NULL - no musr/ScintSD set?");
musrErrorMessage::GetInstance()->musrError(FATAL,eMessage,false);
}
char varName[100];
float fVarValue;
int iVarValue;
sscanf(&line[0],"%*s %*s %s",varName);
if (strcmp(varName,"minNrOfDetectedPhotons")==0) {
sscanf(&line[0],"%*s %*s %*s %d",&iVarValue);
myMusrScintSD -> Set_OPSA_minNrOfDetectedPhotons(iVarValue);
}
else if (strcmp(varName,"signalSeparationTime")==0) {
sscanf(&line[0],"%*s %*s %*s %g",&fVarValue);
myMusrScintSD -> Set_OPSA_SignalSeparationTime(fVarValue*nanosecond);
}
else if (strcmp(varName,"photonFractions")==0) {
float a, b, c, d, e;
sscanf(&line[0],"%*s %*s %*s %g %g %g %g %g",&a, &b, &c, &d, &e);
myMusrScintSD -> Set_OPSA_frac(a,b,c,d,e);
}
else if (strcmp(varName,"eventsForOPSAhistos")==0) {
int i_eventID, i_detectorID;
sscanf(&line[0],"%*s %*s %*s %d %d",&i_eventID,&i_detectorID);
myMusrScintSD -> AddEventIDToMultimapOfEventIDsForOPSAhistos(i_eventID,i_detectorID);
}
else if (strcmp(varName,"OPSAhist")==0) {
int nBins;
float min, max;
sscanf(&line[0],"%*s %*s %*s %d %g %g",&nBins,&min,&max);
myMusrScintSD -> SetOPSAhistoBinning(nBins,min*nanosecond,max*nanosecond);
}
}
}
// cks: Implementation of the Global Field (to allow overlapping fields) based // cks: Implementation of the Global Field (to allow overlapping fields) based
// on the Peter Gumplinger's implementation of G4BeamLine code into Geant4. // on the Peter Gumplinger's implementation of G4BeamLine code into Geant4.
// //
@ -823,7 +986,6 @@ G4VPhysicalVolume* musrDetectorConstruction::Construct() {
int eventWeight; int eventWeight;
char tmpLogVolName[100]; char tmpLogVolName[100];
sscanf(&line[0],"%*s %*s %*s %s %d",tmpLogVolName,&eventWeight); sscanf(&line[0],"%*s %*s %*s %s %d",tmpLogVolName,&eventWeight);
musrSteppingAction* mySteppingAction = musrSteppingAction::GetInstance();
mySteppingAction -> SetVolumeForMuonEventReweighting(G4String(tmpLogVolName),eventWeight); mySteppingAction -> SetVolumeForMuonEventReweighting(G4String(tmpLogVolName),eventWeight);
} }
else { else {
@ -979,6 +1141,15 @@ G4VPhysicalVolume* musrDetectorConstruction::Construct() {
if (strcmp(tmpString2,"det_VvvProcID")==0){musrRootOutput::store_det_VvvProcID = false;} if (strcmp(tmpString2,"det_VvvProcID")==0){musrRootOutput::store_det_VvvProcID = false;}
if (strcmp(tmpString2,"det_VvvTrackID")==0){musrRootOutput::store_det_VvvTrackID = false;} if (strcmp(tmpString2,"det_VvvTrackID")==0){musrRootOutput::store_det_VvvTrackID = false;}
if (strcmp(tmpString2,"det_VvvParticleID")==0){musrRootOutput::store_det_VvvParticleID = false;} if (strcmp(tmpString2,"det_VvvParticleID")==0){musrRootOutput::store_det_VvvParticleID = false;}
if (strcmp(tmpString2,"odet_ID")==0) {musrRootOutput::store_odet_ID = false;}
if (strcmp(tmpString2,"odet_nPhot")==0) {musrRootOutput::store_odet_nPhot = false;}
if (strcmp(tmpString2,"odet_timeFirst")==0) {musrRootOutput::store_odet_timeFirst = false;}
if (strcmp(tmpString2,"odet_timeA")==0) {musrRootOutput::store_odet_timeA = false;}
if (strcmp(tmpString2,"odet_timeB")==0) {musrRootOutput::store_odet_timeB = false;}
if (strcmp(tmpString2,"odet_timeC")==0) {musrRootOutput::store_odet_timeC = false;}
if (strcmp(tmpString2,"odet_timeD")==0) {musrRootOutput::store_odet_timeD = false;}
if (strcmp(tmpString2,"odet_timeE")==0) {musrRootOutput::store_odet_timeE = false;}
if (strcmp(tmpString2,"odet_timeLast")==0) {musrRootOutput::store_odet_timeLast = false;}
} }
else if(strcmp(storeIt,"on")==0) { else if(strcmp(storeIt,"on")==0) {
if (strcmp(tmpString2,"fieldIntegralBx")==0){musrRootOutput::store_fieldIntegralBx = true;} if (strcmp(tmpString2,"fieldIntegralBx")==0){musrRootOutput::store_fieldIntegralBx = true;}
@ -991,12 +1162,13 @@ G4VPhysicalVolume* musrDetectorConstruction::Construct() {
if ((musrRootOutput::store_fieldIntegralBx)||(musrRootOutput::store_fieldIntegralBy)|| if ((musrRootOutput::store_fieldIntegralBx)||(musrRootOutput::store_fieldIntegralBy)||
(musrRootOutput::store_fieldIntegralBz)||(musrRootOutput::store_fieldIntegralBz1)|| (musrRootOutput::store_fieldIntegralBz)||(musrRootOutput::store_fieldIntegralBz1)||
(musrRootOutput::store_fieldIntegralBz2)||(musrRootOutput::store_fieldIntegralBz3) ) { (musrRootOutput::store_fieldIntegralBz2)||(musrRootOutput::store_fieldIntegralBz3) ) {
musrSteppingAction::GetInstance()->SetCalculationOfFieldIntegralRequested(true); mySteppingAction -> SetCalculationOfFieldIntegralRequested(true);
} }
} }
} }
else if (strcmp(tmpString1,"process")==0) { else if ((strcmp(tmpString1,"process")==0)||(strcmp(tmpString1,"G4OpticalPhotons")==0)
||(strcmp(tmpString1,"materialPropertiesTable")==0)||(strcmp(tmpString1,"setMaterialPropertiesTable")==0)) {
; // processes are interpreded later in musrPhysicsList.cc ; // processes are interpreded later in musrPhysicsList.cc
} }
@ -1133,49 +1305,140 @@ void musrDetectorConstruction::DefineMaterials()
new G4Material("ArgonGas", z= 18., a= 39.95*g/mole, density= 0.00000000001*mg/cm3); new G4Material("ArgonGas", z= 18., a= 39.95*g/mole, density= 0.00000000001*mg/cm3);
if (musrParameters::boolG4OpticalPhotons) {
G4NistManager* man = G4NistManager::Instance();
G4Material* scintik = man->FindOrBuildMaterial("G4_PLASTIC_SC_VINYLTOLUENE");
// G4Material* scintik = G4Material::GetMaterial("G4_PLASTIC_SC_VINYLTOLUENE");
G4cout<<"scintik="<<scintik<<G4endl;
if (scintik!=NULL) {
const G4int nEntries = 14;
G4double PhotonEnergy[nEntries] =
{ 2.695*eV, 2.75489*eV, 2.8175*eV, 2.88302*eV, // 460, 450, 440, 430 nm
2.95167*eV, 3.02366*eV, 3.09925*eV, 3.17872*eV, 3.26237*eV, // 420, 410, 400, 390, 380 nm
3.30587*eV, 3.35054*eV, 3.44361*eV, 3.542*eV, 3.64618*eV }; // 375, 370, 360, 350, 340 nm
G4double RefractiveIndex[nEntries] =
{ 1.58, 1.58, 1.58, 1.58,
1.58, 1.58, 1.58, 1.58, 1.58,
1.58, 1.58, 1.58, 1.58, 1.58 };
G4double Absorption[nEntries] =
{ 8*cm, 8*cm, 8*cm, 8*cm,
8*cm, 8*cm, 8*cm, 8*cm, 8*cm,
8*cm, 8*cm, 8*cm, 8*cm, 8*cm };
G4double ScintilFast[nEntries] =
{ 0.01, 0.07, 0.15, 0.26,
0.375, 0.52, 0.65, 0.80, 0.95,
1, 0.88, 0.44, 0.08, 0.01 };
G4double ScintilSlow[nEntries] =
{ 0.01, 0.07, 0.15, 0.26,
0.375, 0.52, 0.65, 0.80, 0.95,
1, 0.88, 0.44, 0.08, 0.01 };
G4MaterialPropertiesTable* myMPT1 = new G4MaterialPropertiesTable();
myMPT1->AddProperty("RINDEX", PhotonEnergy, RefractiveIndex, nEntries);
myMPT1->AddProperty("ABSLENGTH", PhotonEnergy, Absorption, nEntries);
myMPT1->AddProperty("FASTCOMPONENT", PhotonEnergy, ScintilFast, nEntries);
myMPT1->AddProperty("SLOWCOMPONENT", PhotonEnergy, ScintilSlow, nEntries);
myMPT1->AddConstProperty("SCINTILLATIONYIELD", 8400./MeV);
myMPT1->AddConstProperty("RESOLUTIONSCALE",1.0);
myMPT1->AddConstProperty("FASTTIMECONSTANT",1.6*ns);
myMPT1->AddConstProperty("SLOWTIMECONSTANT",1.6*ns);
myMPT1->AddConstProperty("YIELDRATIO",1.0);
scintik->SetMaterialPropertiesTable(myMPT1);
scintik->GetMaterialPropertiesTable()->DumpTable(); if (musrParameters::boolG4OpticalPhotons) {
FILE *fSteeringFile=fopen(parameterFileName.c_str(),"r");
if (fSteeringFile) {
char line[5001];
while (!feof(fSteeringFile)) {
fgets(line,5000,fSteeringFile);
if ((line[0]!='#')&&(line[0]!='\n')&&(line[0]!='\r')) {
char tmpString0[100]="Unset";
sscanf(&line[0],"%s",tmpString0);
if ( (strcmp(tmpString0,"/musr/ignore")!=0) &&(strcmp(tmpString0,"/musr/command")!=0) ) continue;
char tmpString1[100]="Unset",tmpString2[100]="Unset";
sscanf(&line[0],"%*s %s %s",tmpString1,tmpString2);
if (strcmp(tmpString1,"materialPropertiesTable")==0){
std::string materialPropertiesTableName=tmpString2;
G4MaterialPropertiesTable* MPT_tmp;
itMPT = materialPropertiesTableMap.find(materialPropertiesTableName);
if (itMPT==materialPropertiesTableMap.end()) { // G4MaterialPropertiesTable of this name does not exist yet --> create it
MPT_tmp = new G4MaterialPropertiesTable();
materialPropertiesTableMap.insert ( std::pair<std::string,G4MaterialPropertiesTable*>(materialPropertiesTableName,MPT_tmp) );
}
else {
MPT_tmp = itMPT->second;
}
char propertyName[100];
int nEntries;
sscanf(&line[0],"%*s %*s %*s %s %d",propertyName,&nEntries);
std::cout<<" Optical Material Def: MPT_tmp="<<MPT_tmp<<", materialPropertiesTableName="<<materialPropertiesTableName
<<", propertyName="<<propertyName<<", nEntries="<<nEntries<<std::endl;
if (nEntries==0) { // AddConstProperty
float value;
sscanf(&line[0],"%*s %*s %*s %*s %*d %g",&value);
MPT_tmp->AddConstProperty(propertyName,value);
}
else { // AddProperty
char* pch = strstr(line,propertyName)+strlen(propertyName);
float value;
G4double photonEnergyArray[100];
G4double valueArray[100];
char dummy[100];
sscanf(pch,"%s",dummy); char* pch2=strstr(pch,dummy)+strlen(dummy); pch = pch2;
for (int i=0; i<nEntries; i++) {
sscanf(pch,"%g",&value);
// G4cout<<" DDDDD var1="<<value<<" &pch="<<&pch<<G4endl;
photonEnergyArray[i]=value;
sscanf(pch,"%s",dummy); char* pch2=strstr(pch,dummy)+strlen(dummy); pch = pch2;
}
for (int i=0; i<nEntries; i++) {
sscanf(pch,"%g",&value);
// G4cout<<" DDDDD var2="<<value<<" &pch="<<&pch<<G4endl;
valueArray[i]=value;
sscanf(pch,"%s",dummy); char* pch2=strstr(pch,dummy)+strlen(dummy); pch = pch2;
}
MPT_tmp->AddProperty(propertyName,photonEnergyArray,valueArray,nEntries);
}
}
else if (strcmp(tmpString1,"setMaterialPropertiesTable")==0){
char tmpString3[100]="Unset";
sscanf(&line[0],"%*s %*s %*s %s",tmpString3);
std::string materialPropertiesTableName=tmpString2;
std::string materialName = tmpString3;
G4NistManager* man = G4NistManager::Instance();
G4Material* myMaterial = man->FindOrBuildMaterial(materialName);
G4MaterialPropertiesTable* MPT_tmp=NULL;
itMPT = materialPropertiesTableMap.find(materialPropertiesTableName);
if (itMPT==materialPropertiesTableMap.end()) { // G4MaterialPropertiesTable of this name does not exist --> problem
G4cout<<"\n\n musrDetectorConstruction::DefineMaterials(): Material Properties Table \""<<materialPropertiesTableName
<<"\" should be assigned to material \""<<materialName<<"\""<<G4endl;
G4cout<<" but the table was not defined yet (by command /musr/command materialPropertiesTable )"<<G4endl;
G4cout <<" ===> S T O P F O R C E D"<<G4endl;
G4cout<<line<<G4endl;
exit(1);
}
else {
MPT_tmp = itMPT->second;
}
myMaterial->SetMaterialPropertiesTable(MPT_tmp);
G4cout<<myMaterial<<G4endl;
myMaterial->GetMaterialPropertiesTable()->DumpTable();
}
}
}
} }
G4cout<<"OK konec"<<G4endl; fclose(fSteeringFile);
exit(0);
// G4cout<<" 1eV = "<<eV<<G4endl;
// G4cout<<" 1MeV = "<<MeV<<G4endl;
// G4cout<<" 1ns = "<<ns<<G4endl;
//
// G4NistManager* man = G4NistManager::Instance();
// G4Material* scintik = man->FindOrBuildMaterial("G4_PLASTIC_SC_VINYLTOLUENE");
// G4cout<<"scintik="<<scintik<<G4endl;
// if (scintik!=NULL) {
// const G4int nEntries = 14;
// G4double PhotonEnergy[nEntries] =
// { 2.695*eV, 2.75489*eV, 2.8175*eV, 2.88302*eV, // 460, 450, 440, 430 nm
// 2.95167*eV, 3.02366*eV, 3.09925*eV, 3.17872*eV, 3.26237*eV, // 420, 410, 400, 390, 380 nm
// 3.30587*eV, 3.35054*eV, 3.44361*eV, 3.542*eV, 3.64618*eV }; // 375, 370, 360, 350, 340 nm
// G4double RefractiveIndex[nEntries] =
// { 1.58, 1.58, 1.58, 1.58,
// 1.58, 1.58, 1.58, 1.58, 1.58,
// 1.58, 1.58, 1.58, 1.58, 1.58 };
// G4double Absorption[nEntries] =
// { 8*cm, 8*cm, 8*cm, 8*cm,
// 8*cm, 8*cm, 8*cm, 8*cm, 8*cm,
// 8*cm, 8*cm, 8*cm, 8*cm, 8*cm };
// G4double ScintilFast[nEntries] =
// { 0.01, 0.07, 0.15, 0.26,
// 0.375, 0.52, 0.65, 0.80, 0.95,
// 1, 0.88, 0.44, 0.08, 0.01 };
// G4double ScintilSlow[nEntries] =
// { 0.01, 0.07, 0.15, 0.26,
// 0.375, 0.52, 0.65, 0.80, 0.95,
// 1, 0.88, 0.44, 0.08, 0.01 };
// G4MaterialPropertiesTable* myMPT1 = new G4MaterialPropertiesTable();
// myMPT1->AddProperty("RINDEX", PhotonEnergy, RefractiveIndex, nEntries);
// myMPT1->AddProperty("ABSLENGTH", PhotonEnergy, Absorption, nEntries);
// myMPT1->AddProperty("FASTCOMPONENT", PhotonEnergy, ScintilFast, nEntries);
// myMPT1->AddProperty("SLOWCOMPONENT", PhotonEnergy, ScintilSlow, nEntries);
// myMPT1->AddConstProperty("SCINTILLATIONYIELD", 8400./MeV);
// myMPT1->AddConstProperty("RESOLUTIONSCALE",1.0);
// myMPT1->AddConstProperty("FASTTIMECONSTANT",1.6*ns);
// myMPT1->AddConstProperty("SLOWTIMECONSTANT",1.6*ns);
// myMPT1->AddConstProperty("YIELDRATIO",1.0);
// scintik->SetMaterialPropertiesTable(myMPT1);
// scintik->GetMaterialPropertiesTable()->DumpTable();
// }
} }
} }
@ -1240,6 +1503,25 @@ G4LogicalVolume* musrDetectorConstruction::FindLogicalVolume(G4String LogicalVol
return NULL; return NULL;
} }
G4VPhysicalVolume* musrDetectorConstruction::FindPhysicalVolume(G4String PhysicalVolumeName) {
G4PhysicalVolumeStore* pPhysStore = G4PhysicalVolumeStore::GetInstance();
if (pPhysStore==NULL) {
G4cout<<"ERROR: musrDetectorConstruction.cc: G4PhysicalVolumeStore::GetInstance() not found!"<<G4endl;
}
else {
for (unsigned int i=0; i<pPhysStore->size(); i++) {
G4VPhysicalVolume* pPhysVol=pPhysStore->at(i);
G4String iPhysName=pPhysVol->GetName();
if (iPhysName==PhysicalVolumeName) {
return pPhysVol;
}
}
}
G4cout<<"\n musrDetectorConstruction.cc::FindPhysicalVolume: \n ERROR !!! Physical volume "
<<PhysicalVolumeName<<" not found !!!"<<G4endl;
return NULL;
}
void musrDetectorConstruction::SetColourOfLogicalVolume(G4LogicalVolume* pLogVol,char* colour) { void musrDetectorConstruction::SetColourOfLogicalVolume(G4LogicalVolume* pLogVol,char* colour) {
if (pLogVol!=NULL) { if (pLogVol!=NULL) {
if (strcmp(colour,"red" )==0) {pLogVol->SetVisAttributes(G4Colour(1,0,0));} if (strcmp(colour,"red" )==0) {pLogVol->SetVisAttributes(G4Colour(1,0,0));}

View File

@ -77,6 +77,8 @@ void musrEventAction::BeginOfEventAction(const G4Event* evt) {
void musrEventAction::EndOfEventAction(const G4Event* evt) { void musrEventAction::EndOfEventAction(const G4Event* evt) {
// cout << ":." << flush; // cout << ":." << flush;
long thisEventNr = (long) evt->GetEventID(); long thisEventNr = (long) evt->GetEventID();
// musrSteppingAction::GetInstance()->DoAtTheEndOfEvent();
// write out the root tree: // write out the root tree:
musrRootOutput* myRootOutput = musrRootOutput::GetRootInstance(); musrRootOutput* myRootOutput = musrRootOutput::GetRootInstance();

View File

@ -46,6 +46,8 @@
#include "G4StepLimiter.hh" #include "G4StepLimiter.hh"
#include "G4UserSpecialCuts.hh" #include "G4UserSpecialCuts.hh"
#include "G4OpticalPhysics.hh"
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
musrPhysicsList::musrPhysicsList(): G4VUserPhysicsList() musrPhysicsList::musrPhysicsList(): G4VUserPhysicsList()
@ -55,6 +57,26 @@ musrPhysicsList::musrPhysicsList(): G4VUserPhysicsList()
cutForElectron = 0.1*mm; cutForElectron = 0.1*mm;
cutForMuon = 0.01*mm; cutForMuon = 0.01*mm;
SetVerboseLevel(0); SetVerboseLevel(0);
if (musrParameters::boolG4OpticalPhotons) {
// // * Optical Physics
// G4OpticalPhysics* opticalPhysics = new G4OpticalPhysics();
// RegisterPhysics( opticalPhysics );
//
// // adjust some parameters for the optical physics
// opticalPhysics->SetWLSTimeProfile("delta");
//
// opticalPhysics->SetScintillationYieldFactor(1.0);
// opticalPhysics->SetScintillationExcitationRatio(0.0);
//
// opticalPhysics->SetMaxNumPhotonsPerStep(100);
// opticalPhysics->SetMaxBetaChangePerStep(10.0);
//
// opticalPhysics->SetTrackSecondariesFirst(true);
}
} }
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
@ -71,6 +93,13 @@ void musrPhysicsList::ConstructParticle()
ConstructLeptons(); ConstructLeptons();
ConstructMesons(); ConstructMesons();
ConstructBaryons(); ConstructBaryons();
if (musrParameters::boolG4OpticalPhotons) {
// optical photon
G4OpticalPhoton::OpticalPhotonDefinition();
}
} }
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
@ -234,6 +263,9 @@ void musrPhysicsList::ConstructProcess()
// For a simple Muonium "scattering" when Mu hits solid materials // For a simple Muonium "scattering" when Mu hits solid materials
#include "musrMuScatter.hh" #include "musrMuScatter.hh"
// For optical photons
#include "G4Scintillation.hh"
// For models // For models
#include "G4ProcessTable.hh" #include "G4ProcessTable.hh"
#include "G4WentzelVIModel.hh" #include "G4WentzelVIModel.hh"
@ -273,6 +305,11 @@ void musrPhysicsList::ConstructEM()
G4ParticleDefinition* particleDefinition = G4ParticleTable::GetParticleTable() -> FindParticle(stringParticleName); G4ParticleDefinition* particleDefinition = G4ParticleTable::GetParticleTable() -> FindParticle(stringParticleName);
// G4cout<<"particleDefinition of "<<stringParticleName<<" = "<<particleDefinition<<G4endl; // G4cout<<"particleDefinition of "<<stringParticleName<<" = "<<particleDefinition<<G4endl;
if (particleDefinition==NULL) { if (particleDefinition==NULL) {
if ((stringParticleName=="opticalphoton")&& (!(musrParameters::boolG4OpticalPhotons))) {
musrErrorMessage::GetInstance()->musrError(INFO,
"musrPhysicsList: Ignoring optical photon process definition because G4OpticalPhotons in *.mac file is set to false",false);
continue;
}
sprintf(eMessage,"musrPhysicsList: Partile \"%s\" not found in G4ParticleTable when trying to find or assign process \"%s\".", sprintf(eMessage,"musrPhysicsList: Partile \"%s\" not found in G4ParticleTable when trying to find or assign process \"%s\".",
charParticleName,charProcessName); charParticleName,charProcessName);
musrErrorMessage::GetInstance()->musrError(FATAL,eMessage,false); musrErrorMessage::GetInstance()->musrError(FATAL,eMessage,false);
@ -294,6 +331,11 @@ void musrPhysicsList::ConstructEM()
else if (stringProcessName=="G4LowEnergyRayleigh") pManager->AddDiscreteProcess(new G4LowEnergyRayleigh); else if (stringProcessName=="G4LowEnergyRayleigh") pManager->AddDiscreteProcess(new G4LowEnergyRayleigh);
else if (stringProcessName=="G4CoulombScattering") pManager->AddDiscreteProcess(new G4CoulombScattering); else if (stringProcessName=="G4CoulombScattering") pManager->AddDiscreteProcess(new G4CoulombScattering);
else if (stringProcessName=="G4OpAbsorption") pManager->AddDiscreteProcess(new G4OpAbsorption);
else if (stringProcessName=="G4OpRayleigh") pManager->AddDiscreteProcess(new G4OpRayleigh);
else if (stringProcessName=="G4OpBoundaryProcess") pManager->AddDiscreteProcess(new G4OpBoundaryProcess);
else if (stringProcessName=="G4OpWLS") pManager->AddDiscreteProcess(new G4OpWLS);
else { else {
sprintf(eMessage,"musrPhysicsList: Process \"%s\" is not implemented in musrPhysicsList.cc for addDiscreteProcess. It can be easily added.", sprintf(eMessage,"musrPhysicsList: Process \"%s\" is not implemented in musrPhysicsList.cc for addDiscreteProcess. It can be easily added.",
charProcessName); charProcessName);
@ -325,6 +367,7 @@ void musrPhysicsList::ConstructEM()
// else if (stringProcessName=="G4hIonisation") pManager->AddProcess(new G4hIonisation,nr1,nr2,nr3); // else if (stringProcessName=="G4hIonisation") pManager->AddProcess(new G4hIonisation,nr1,nr2,nr3);
// else if (stringProcessName=="G4hLowEnergyIonisation") pManager->AddProcess(new G4hLowEnergyIonisation,nr1,nr2,nr3); // else if (stringProcessName=="G4hLowEnergyIonisation") pManager->AddProcess(new G4hLowEnergyIonisation,nr1,nr2,nr3);
else if (stringProcessName=="musrMuFormation") pManager->AddProcess(new musrMuFormation,nr1,nr2,nr3); else if (stringProcessName=="musrMuFormation") pManager->AddProcess(new musrMuFormation,nr1,nr2,nr3);
else if (stringProcessName=="G4Scintillation") pManager->AddProcess(new G4Scintillation,nr1,nr2,nr3);
// cks: musrMuScatter could be uncommented here, but testing is needed, because Toni has some strange comments // cks: musrMuScatter could be uncommented here, but testing is needed, because Toni has some strange comments
// in his original "musrPhysicsList.cc about implementing musrMuScatter. // in his original "musrPhysicsList.cc about implementing musrMuScatter.
// else if (stringProcessName=="musrMuScatter") pManager->AddProcess(new musrMuScatter,nr1,nr2,nr3); // else if (stringProcessName=="musrMuScatter") pManager->AddProcess(new musrMuScatter,nr1,nr2,nr3);
@ -394,7 +437,6 @@ void musrPhysicsList::ConstructEM()
G4MuMultipleScattering* mmm = (G4MuMultipleScattering*) processTable->FindProcess("muMsc",particleDefinition); G4MuMultipleScattering* mmm = (G4MuMultipleScattering*) processTable->FindProcess("muMsc",particleDefinition);
mmm->AddEmModel(modelPriority, new G4UrbanMscModel93()); mmm->AddEmModel(modelPriority, new G4UrbanMscModel93());
} }
else { else {
sprintf(eMessage,"musrPhysicsList: Model \"%s\" is not implemented for \"%s\" in musrPhysicsList.cc for addModel. It can be easily added.", sprintf(eMessage,"musrPhysicsList: Model \"%s\" is not implemented for \"%s\" in musrPhysicsList.cc for addModel. It can be easily added.",
charModelName,charProcessName); charModelName,charProcessName);

View File

@ -147,6 +147,16 @@ G4bool musrRootOutput::store_fieldIntegralBz = false;
G4bool musrRootOutput::store_fieldIntegralBz1 = false; G4bool musrRootOutput::store_fieldIntegralBz1 = false;
G4bool musrRootOutput::store_fieldIntegralBz2 = false; G4bool musrRootOutput::store_fieldIntegralBz2 = false;
G4bool musrRootOutput::store_fieldIntegralBz3 = false; G4bool musrRootOutput::store_fieldIntegralBz3 = false;
G4bool musrRootOutput::store_odet_ID = true;
G4bool musrRootOutput::store_odet_nPhot = true;
G4bool musrRootOutput::store_odet_timeFirst = true;
G4bool musrRootOutput::store_odet_timeA = true;
G4bool musrRootOutput::store_odet_timeB = true;
G4bool musrRootOutput::store_odet_timeC = true;
G4bool musrRootOutput::store_odet_timeD = true;
G4bool musrRootOutput::store_odet_timeE = true;
G4bool musrRootOutput::store_odet_timeLast = true;
G4int musrRootOutput::oldEventNumberInG4EqEMFieldWithSpinFunction=-1; G4int musrRootOutput::oldEventNumberInG4EqEMFieldWithSpinFunction=-1;
@ -265,6 +275,19 @@ void musrRootOutput::BeginOfRunAction() {
rootTree->Branch("save_poly",&save_poly,"save_poly[save_n]/D"); rootTree->Branch("save_poly",&save_poly,"save_poly[save_n]/D");
rootTree->Branch("save_polz",&save_polz,"save_polz[save_n]/D"); rootTree->Branch("save_polz",&save_polz,"save_polz[save_n]/D");
} }
if (store_odet_ID || store_odet_nPhot || store_odet_timeFirst || store_odet_timeA || store_odet_timeB ||
store_odet_timeC || store_odet_timeD || store_odet_timeE || store_odet_timeLast)
{rootTree->Branch("odet_n",&odet_n,"odet_n/I");}
if (store_odet_ID) {rootTree->Branch("odet_ID",&odet_ID,"odet_ID[odet_n]/I");}
if (store_odet_nPhot) {rootTree->Branch("odet_nPhot",&odet_nPhot,"odet_nPhot[odet_n]/I");}
if (store_odet_timeFirst) {rootTree->Branch("odet_timeFirst",&odet_timeFirst,"odet_timeFirst[odet_n]/D");}
if (store_odet_timeA) {rootTree->Branch("odet_timeA",&odet_timeA,"odet_timeA[odet_n]/D");}
if (store_odet_timeB) {rootTree->Branch("odet_timeB",&odet_timeB,"odet_timeB[odet_n]/D");}
if (store_odet_timeC) {rootTree->Branch("odet_timeC",&odet_timeC,"odet_timeC[odet_n]/D");}
if (store_odet_timeD) {rootTree->Branch("odet_timeD",&odet_timeD,"odet_timeD[odet_n]/D");}
if (store_odet_timeE) {rootTree->Branch("odet_timeE",&odet_timeE,"odet_timeE[odet_n]/D");}
if (store_odet_timeLast) {rootTree->Branch("odet_timeLast",&odet_timeLast,"odet_timeLast[odet_n]/D");}
// htest1 = new TH1F("htest1","The debugging histogram 1",50,-4.,4.); // htest1 = new TH1F("htest1","The debugging histogram 1",50,-4.,4.);
// htest2 = new TH1F("htest2","The debugging histogram 2",50,0.,3.142); // htest2 = new TH1F("htest2","The debugging histogram 2",50,0.,3.142);
@ -317,7 +340,7 @@ void musrRootOutput::FillEvent() {
htest5->Fill(atan2(posIniMomy,posIniMomx)); htest5->Fill(atan2(posIniMomy,posIniMomx));
htest6->Fill(atan2(sqrt(posIniMomx*posIniMomx+posIniMomy*posIniMomy),posIniMomz)); htest6->Fill(atan2(sqrt(posIniMomx*posIniMomx+posIniMomy*posIniMomy),posIniMomz));
if (weight>0.) { if (weight>0.) {
if ( !((musrParameters::storeOnlyEventsWithHits)&&(det_n<=0)) ) { if ( !((musrParameters::storeOnlyEventsWithHits)&&(det_n<=0)&&(odet_n<=0)) ) {
rootTree->Fill(); rootTree->Fill();
} }
} }
@ -349,7 +372,7 @@ void musrRootOutput::ClearAllRootVariables() {
BzIntegral1 = -1000; BzIntegral2 = -1000; BzIntegral3 = -1000; BzIntegral1 = -1000; BzIntegral2 = -1000; BzIntegral3 = -1000;
det_n=0; det_n=0;
save_n=0; save_n=0;
odet_n=0;
} }
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
@ -498,3 +521,27 @@ void musrRootOutput::SetDetectorInfoVvv (G4int nDetectors,
det_VvvParticleID[nDetectors]=particleID; det_VvvParticleID[nDetectors]=particleID;
} }
} }
void musrRootOutput::SetOPSAinfo (G4int nDetectors, G4int ID, G4int nPhot, G4double timeFirst, G4double timeA,
G4double timeB, G4double timeC, G4double timeD, G4double timeE, G4double timeLast)
{
if ((nDetectors<0)||(nDetectors>=(odet_nMax-1))) {
char message[200];
sprintf(message,"musrRootOutput.cc::SetOPSAInfo: nDetectors %i is larger than det_nMax = %i",nDetectors,det_nMax);
musrErrorMessage::GetInstance()->musrError(SERIOUS,message,false);
return;
}
else {
odet_n=nDetectors+1;
odet_ID[nDetectors]=ID;
odet_nPhot[nDetectors]=nPhot;
odet_timeFirst[nDetectors]=timeFirst/microsecond;
odet_timeA[nDetectors]=timeA/microsecond;
odet_timeB[nDetectors]=timeB/microsecond;
odet_timeC[nDetectors]=timeC/microsecond;
odet_timeD[nDetectors]=timeD/microsecond;
odet_timeE[nDetectors]=timeE/microsecond;
odet_timeLast[nDetectors]=timeLast/microsecond;
}
}

View File

@ -29,9 +29,14 @@
#include "G4ios.hh" #include "G4ios.hh"
#include <algorithm> // needed for the sort() function #include <algorithm> // needed for the sort() function
#include "G4VProcess.hh" // needed for the degugging message of the process name #include "G4VProcess.hh" // needed for the degugging message of the process name
#include "G4OpBoundaryProcess.hh" // Optical photon process
#include "G4RunManager.hh"
#include "musrParameters.hh" #include "musrParameters.hh"
#include "musrErrorMessage.hh" #include "musrErrorMessage.hh"
#include "musrSteppingAction.hh" #include "musrSteppingAction.hh"
//#include "TCanvas.h"
#include "TMath.h"
#include "TF1.h"
#include <vector> #include <vector>
//bool myREMOVEfunction (int i,int j) { return (i<j); } //bool myREMOVEfunction (int i,int j) { return (i<j); }
@ -49,17 +54,38 @@
// //
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
Double_t poissonf(Double_t* x, Double_t* par) {
return par[0]*TMath::Poisson(x[0],par[1]);
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
musrScintSD::musrScintSD(G4String name) musrScintSD::musrScintSD(G4String name)
:G4VSensitiveDetector(name) :G4VSensitiveDetector(name)
{ {
pointer=this;
G4String HCname; G4String HCname;
collectionName.insert(HCname="scintCollection"); collectionName.insert(HCname="scintCollection");
OPSA_minNrOfDetectedPhotons = 1;
OPSA_signalSeparationTime = 10.;
OPSA_fracA = 0.01;
OPSA_fracB = 0.05;
OPSA_fracC = 0.10;
OPSA_fracD = 0.20;
OPSA_fracE = 0.5;
bool_multimapOfEventIDsForOPSAhistosEXISTS = false;
OPSAhistoNbin = 100;
OPSAhistoMin =0;
OPSAhistoMax = 10.;
} }
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
musrScintSD::~musrScintSD(){ } musrScintSD::~musrScintSD(){ }
musrScintSD* musrScintSD::pointer=NULL;
musrScintSD* musrScintSD::GetInstance() {return pointer;}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
void musrScintSD::Initialize(G4HCofThisEvent* HCE) { void musrScintSD::Initialize(G4HCofThisEvent* HCE) {
@ -78,6 +104,7 @@ void musrScintSD::Initialize(G4HCofThisEvent* HCE) {
myStoreOnlyEventsWithHitInDetID = musrParameters::storeOnlyEventsWithHitInDetID; myStoreOnlyEventsWithHitInDetID = musrParameters::storeOnlyEventsWithHitInDetID;
musrSteppingAction* myMusrSteppingAction = musrSteppingAction::GetInstance(); musrSteppingAction* myMusrSteppingAction = musrSteppingAction::GetInstance();
boolIsVvvInfoRequested = myMusrSteppingAction->IsVvvInfoRequested(); boolIsVvvInfoRequested = myMusrSteppingAction->IsVvvInfoRequested();
myRootOutput = musrRootOutput::GetRootInstance();
} }
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
@ -91,7 +118,15 @@ G4bool musrScintSD::ProcessHits(G4Step* aStep,G4TouchableHistory*)
} }
G4Track* aTrack = aStep->GetTrack(); G4Track* aTrack = aStep->GetTrack();
G4String actualVolume=aTrack->GetVolume()->GetLogicalVolume()->GetName(); // G4LogicalVolume* hitLogicalVolume = aTrack->GetVolume()->GetLogicalVolume();
// G4String actualVolume=aTrack->GetVolume()->GetLogicalVolume()->GetName();
G4String hitLogicalVolumeName = aTrack->GetVolume()->GetLogicalVolume()->GetName();
G4String particleName=aTrack->GetDefinition()->GetParticleName();
// if (particleName=="opticalphoton") {G4cout<<"UFON JE TU: edep="<<edep<<G4endl; return false;}
if (particleName=="opticalphoton") {
ProcessOpticalPhoton(aStep);
return false;
}
// If requested, store only the hit that happened first (usefull for some special studies, not for a serious simulation) // If requested, store only the hit that happened first (usefull for some special studies, not for a serious simulation)
if (myStoreOnlyTheFirstTimeHit) { if (myStoreOnlyTheFirstTimeHit) {
@ -101,17 +136,21 @@ G4bool musrScintSD::ProcessHits(G4Step* aStep,G4TouchableHistory*)
return false; return false;
} }
} }
musrScintHit* newHit = new musrScintHit(); musrScintHit* newHit = new musrScintHit();
newHit->SetParticleName (aTrack->GetDefinition()->GetParticleName()); // newHit->SetParticleName (aTrack->GetDefinition()->GetParticleName());
newHit->SetParticleName(particleName);
G4int particleID = aTrack->GetDefinition()->GetPDGEncoding(); G4int particleID = aTrack->GetDefinition()->GetPDGEncoding();
newHit->SetParticleID (particleID); newHit->SetParticleID (particleID);
newHit->SetEdep (edep); newHit->SetEdep (edep);
newHit->SetPrePos (aStep->GetPreStepPoint()->GetPosition()); newHit->SetPrePos (aStep->GetPreStepPoint()->GetPosition());
newHit->SetPostPos (aStep->GetPostStepPoint()->GetPosition()); newHit->SetPostPos (aStep->GetPostStepPoint()->GetPosition());
newHit->SetPol (aTrack->GetPolarization()); newHit->SetPol (aTrack->GetPolarization());
G4LogicalVolume* hitLogicalVolume = aTrack->GetVolume()->GetLogicalVolume(); // G4LogicalVolume* hitLogicalVolume = aTrack->GetVolume()->GetLogicalVolume();
newHit->SetLogVolName(hitLogicalVolume->GetName()); newHit->SetLogVolName(hitLogicalVolumeName);
// newHit->SetLogVolName(hitLogicalVolume->GetName());
newHit->SetGlobTime(aTrack->GetGlobalTime()); newHit->SetGlobTime(aTrack->GetGlobalTime());
// Warning - aStep->IsFirstStepInVolume() only available in Geant version >= 4.8.2 ! // Warning - aStep->IsFirstStepInVolume() only available in Geant version >= 4.8.2 !
// newHit->SetFirstStepInVolumeFlag(aStep->IsFirstStepInVolume()); // newHit->SetFirstStepInVolumeFlag(aStep->IsFirstStepInVolume());
@ -141,6 +180,94 @@ G4bool musrScintSD::ProcessHits(G4Step* aStep,G4TouchableHistory*)
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
void musrScintSD::ProcessOpticalPhoton(G4Step* aStep) {
// //Was the photon absorbed by the absorption process ?
// const G4VProcess* process = aStep->GetPostStepPoint()->GetProcessDefinedStep();
// G4String processName = (process) ? process->GetProcessName() : "Unknown";
// G4cout<<"processName="<<processName<<G4endl;
// if (processName=="OpAbsorption") {
// G4cout<<"\n ABSORPTION\n";
// }
G4OpBoundaryProcessStatus boundaryStatus=Undefined;
static G4OpBoundaryProcess* boundaryProc=NULL;
//find the boundary process only once
if(!boundaryProc){
G4ProcessManager* pm = aStep->GetTrack()->GetDefinition()->GetProcessManager();
G4int nprocesses = pm->GetProcessListLength();
G4ProcessVector* pv = pm->GetProcessList();
for(G4int i=0; i<nprocesses; i++){
if((*pv)[i]->GetProcessName()=="OpBoundary"){
boundaryProc = (G4OpBoundaryProcess*)(*pv)[i];
break;
}
}
}
boundaryStatus=boundaryProc->GetStatus();
//Check to see if the partcile was actually at a boundary
//Otherwise the boundary status may not be valid
//Prior to Geant4.6.0-p1 this would not have been enough to check
if(aStep->GetPostStepPoint()->GetStepStatus()==fGeomBoundary){
// G4cout<<" boundaryStatus="<<boundaryStatus<<" ";
G4String actualVolume = aStep->GetTrack()->GetVolume()->GetLogicalVolume()->GetName();
Int_t detID = myRootOutput->ConvertVolumeToID(actualVolume);
// G4cout<<" detID ="<<detID<<" actualVolume="<<actualVolume;
optHitMapType::iterator iter = optHitMap.find(detID);
if (iter==optHitMap.end()) { // optHitDetectorMapType does not exist ==> create it
optHitDetectorMapType* optHitDetectorMapTmp = new optHitDetectorMapType;
optHitMap.insert(std::pair<Int_t,optHitDetectorMapType*>(detID,optHitDetectorMapTmp));
iter = optHitMap.find(detID);
}
optHitDetectorMapType* optHitDetectorMap = (*iter).second;
// optHitDetectorMapType optHitDetectorMap = optHitMap[detID];
G4double tmpTime = aStep->GetPreStepPoint()->GetGlobalTime();
// G4cout<<" tmpTime="<<tmpTime;
// optHitDetectorMap->insert(std::pair<G4double,G4int>(tmpTime,boundaryStatus));
if (boundaryStatus!=Detection) {
char message[200];
sprintf(message,"musrScintSD.cc::ProcessOpticalPhoton(): Optical photon boundary status is not Detection but %i",boundaryStatus);
musrErrorMessage::GetInstance()->musrError(FATAL,message,false);
}
// switch(boundaryStatus){
// case Absorption:
// G4cout<<" AAAAAAAAAAAAAAAAAA Absorption"<<G4endl;
// break;
// case Detection: //Note, this assumes that the volume causing detection
//is the photocathode because it is the only one with
//non-zero efficiency
optHitDetectorMap->insert(std::pair<G4double,G4int>(tmpTime,boundaryStatus));
// G4cout<<" Detection"<<G4endl;
// break;
// case FresnelReflection:
// case LambertianReflection:
// case LobeReflection:
// case TotalInternalReflection:
// case SpikeReflection:
// G4cout<<" Reflection"<<G4endl;
// break;
// case StepTooSmall:
// G4cout<<" StepTooSmall"<<G4endl;
// break;
// case NoRINDEX:
// G4cout<<" NoRINDEX"<<G4endl;
// break;
// // case :
// // G4cout<<" "<<G4endl;
// // break;
// default:
// G4cout<<" SomethingElse"<<G4endl;
// break;
// }
}
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
void musrScintSD::EndOfEvent(G4HCofThisEvent*) { void musrScintSD::EndOfEvent(G4HCofThisEvent*) {
if (verboseLevel>1) { if (verboseLevel>1) {
G4cout<<"VERBOSE 2: musrScintSD::EndOfEvent"<<G4endl; G4cout<<"VERBOSE 2: musrScintSD::EndOfEvent"<<G4endl;
@ -149,8 +276,6 @@ void musrScintSD::EndOfEvent(G4HCofThisEvent*) {
<< " hits in the scint chambers: " << G4endl; << " hits in the scint chambers: " << G4endl;
} }
// Positron_momentum_already_stored=0;
musrRootOutput* myRootOutput = musrRootOutput::GetRootInstance();
G4int NbHits = scintCollection->entries(); G4int NbHits = scintCollection->entries();
@ -367,6 +492,144 @@ void musrScintSD::EndOfEvent(G4HCofThisEvent*) {
} }
} //end "if (NbHits>0)" } //end "if (NbHits>0)"
// Analyse optical photons if they were produced
if (musrParameters::boolG4OpticalPhotons) EndOfEvent_OptiacalPhotons();
} }
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
void musrScintSD::EndOfEvent_OptiacalPhotons() {
// G4double kCarTolerance = G4GeometryTolerance::GetInstance() ->GetSurfaceTolerance();
// G4cout<<" DEBUG 10: kCarTolerance="<<kCarTolerance<<G4endl;
if (optHitMap.empty()) return;
G4RunManager* fRunManager = G4RunManager::GetRunManager();
G4int eeeventID = fRunManager->GetCurrentEvent()->GetEventID();
for (optHitMapType::const_iterator it=optHitMap.begin() ; it != optHitMap.end(); it++ ) {
G4bool boolStoreThisOPSAhist = false;
G4int OPSA_detID= it->first;
optHitDetectorMapType* optHitDetectorMap = it->second;
// Check whether OPSA histograming of times of optical photon detection is required for this eventID.
if (bool_multimapOfEventIDsForOPSAhistosEXISTS) {
if (multimapOfEventIDsForOPSAhistos.find(eeeventID)!=multimapOfEventIDsForOPSAhistos.end()) {
// Now check whether the histogramming is required for the currently analysed detector.
std::pair<multimapOfEventIDsForOPSAhistos_Type::iterator,multimapOfEventIDsForOPSAhistos_Type::iterator> retOPSAhist;
multimapOfEventIDsForOPSAhistos_Type::iterator itOPSAhist;
retOPSAhist = multimapOfEventIDsForOPSAhistos.equal_range(eeeventID);
for (itOPSAhist = retOPSAhist.first; itOPSAhist!=retOPSAhist.second; itOPSAhist++) {
// Store histograms if the second parameters of eventsForOPSAhistos (i.e. detector ID)
// is set to 0 or corresponds to the currently analysed sensitive detector.
if ( (itOPSAhist->second == 0) || (itOPSAhist->second == OPSA_detID) ) boolStoreThisOPSAhist = true;
}
}
}
if (optHitDetectorMap->empty()) continue;
optHitDetectorMapType::const_iterator it2_START = optHitDetectorMap->begin();
optHitDetectorMapType::const_iterator it2_STOP = it2_START;
optHitDetectorMapType::const_iterator it2_LAST = optHitDetectorMap->end(); it2_LAST--;
Double_t time = -1000, lastTime = -1000;
G4int OPSA_nPhot = 0;
G4double OPSA_timeFirst = -1000;
G4double OPSA_timeA = -1000;
G4double OPSA_timeB = -1000;
G4double OPSA_timeC = -1000;
G4double OPSA_timeD = -1000;
G4double OPSA_timeE = -1000;
G4double OPSA_timeLast = -1000;
G4int iHistNr = -1;
TF1* poiss = NULL;
for (optHitDetectorMapType::const_iterator it2 = optHitDetectorMap->begin(); it2 != optHitDetectorMap->end(); it2++ ) {
OPSA_nPhot++;
lastTime = time;
time = it2->first;
if (OPSA_nPhot==1) lastTime=time; // First photon does not have a proper "lastTime" defined
if ( (it2==it2_LAST) || ((time-lastTime) > OPSA_signalSeparationTime)) {
// The iterator it2 reached last element of the map optHitDetectorMap or
// the time difference between two subsequently detected photons is too big ==> divide the signal into more signals
it2_STOP = it2;
if (it2==it2_LAST) it2_STOP++; // if we are at the end of optHitDetectorMap,
// the it2_STOP should point just behind the last map element
else OPSA_nPhot--; // if we split the optHitDetectorMap, however, the latest optical photon
// should have not be counted, because it belong to the next signal.
optHitDetectorMapType optHitDetectorSUBmap(it2_START, it2_STOP);
it2_START = it2_STOP;
if (OPSA_nPhot >= OPSA_minNrOfDetectedPhotons) { // ignore hits with too low number of detected photons
G4double OPSA_f_nPhot = OPSA_nPhot;
G4int NA = int (OPSA_fracA * OPSA_f_nPhot + 0.5);
G4int NB = int (OPSA_fracB * OPSA_f_nPhot + 0.5);
G4int NC = int (OPSA_fracC * OPSA_f_nPhot + 0.5);
G4int ND = int (OPSA_fracD * OPSA_f_nPhot + 0.5);
G4int NE = int (OPSA_fracE * OPSA_f_nPhot + 0.5);
Int_t nP=0;
// Define OPSA histograms if required for this event
if (boolStoreThisOPSAhist) {
iHistNr++;
char nameHist[100]; sprintf(nameHist,"OPSAhist_%d_%d_%d",eeeventID,OPSA_detID,iHistNr);
char nameHistTitle[100]; sprintf(nameHistTitle,"OPSAhist_%d_%d_%d;time (ns);Nr of photons",eeeventID,OPSA_detID,iHistNr);
OPSAhisto = new TH1D(nameHist, nameHistTitle, OPSAhistoNbin, OPSAhistoMin, OPSAhistoMax);
poiss = new TF1("poiss",poissonf,0.,.5,2); // x in [0;300], 2
poiss->SetParameter(0,1);
poiss->SetParameter(1,1);
}
for (optHitDetectorMapType::const_iterator it3 = optHitDetectorSUBmap.begin(); it3 != optHitDetectorSUBmap.end(); it3++) {
nP++;
if (nP==1) OPSA_timeFirst = it3->first;
if (nP==NA) OPSA_timeA = it3->first;
if (nP==NB) OPSA_timeB = it3->first;
if (nP==NC) OPSA_timeC = it3->first;
if (nP==ND) OPSA_timeD = it3->first;
if (nP==NE) OPSA_timeE = it3->first;
if (nP==OPSA_nPhot) OPSA_timeLast = it3->first;
if (boolStoreThisOPSAhist) OPSAhisto->Fill((it3->first)-OPSA_timeFirst+0.00000000001);
}
signalInfo* mySignalInfo = new signalInfo(OPSA_detID,OPSA_nPhot,OPSA_timeFirst,OPSA_timeA,OPSA_timeB,OPSA_timeC,
OPSA_timeD,OPSA_timeE,OPSA_timeLast);
OPSA_signal_Map.insert(std::pair<G4int,signalInfo*>(OPSA_nPhot,mySignalInfo) );
if (boolStoreThisOPSAhist) {
OPSAhisto->Fit(poiss,"Q");
OPSAhisto->Write();
// TCanvas* cc = new TCanvas();
// OPSAhisto->Draw();
// cc->Update();
}
}
OPSA_nPhot = 0;
OPSA_timeFirst = -1000;
OPSA_timeA = -1000;
OPSA_timeB = -1000;
OPSA_timeC = -1000;
OPSA_timeD = -1000;
OPSA_timeE = -1000;
OPSA_timeLast = -1000;
}
}
}
// Now delete all optHitDetectorMap*
for (optHitMapType::const_iterator it=optHitMap.begin() ; it != optHitMap.end(); it++ ) {
delete (it->second);
}
optHitMap.clear();
// Now store the information of all mySignalInfo* to rootOutputFile
G4int nn=0;
for (OPSA_signal_MapType::reverse_iterator ritOPSA = OPSA_signal_Map.rbegin(); ritOPSA != OPSA_signal_Map.rend(); ritOPSA++) {
(ritOPSA->second) -> transferDataToRoot(myRootOutput,nn);
nn++;
}
// Now delete all mySignalInfo* from OPSA_signal_Map
for (OPSA_signal_MapType::const_iterator itOPSA = OPSA_signal_Map.begin(); itOPSA != OPSA_signal_Map.end(); itOPSA++) {
delete (itOPSA->second);
}
OPSA_signal_Map.clear();
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......

View File

@ -29,25 +29,35 @@
#include "G4MagneticField.hh" // needed for storing the magnetic field to the Root class #include "G4MagneticField.hh" // needed for storing the magnetic field to the Root class
#include "G4FieldManager.hh" // ---------------||------------------ #include "G4FieldManager.hh" // ---------------||------------------
#include "G4TransportationManager.hh" // ---------------||------------------ #include "G4TransportationManager.hh" // ---------------||------------------
//#include "G4OpBoundaryProcess.hh" // Optical photon process
#include "musrErrorMessage.hh" #include "musrErrorMessage.hh"
#include "musrParameters.hh" #include "musrParameters.hh"
#include "F04GlobalField.hh" #include "F04GlobalField.hh"
//#include "TCanvas.h"
//#include "TMath.h"
//#include "TF1.h"
//#include "G4GeometryTolerance.hh"
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
//Double_t poissonf(Double_t* x, Double_t* par) {
// return par[0]*TMath::Poisson(x[0],par[1]);
//}
musrSteppingAction::musrSteppingAction() { musrSteppingAction::musrSteppingAction() {
pointer=this; pointer=this;
boolIsAnySpecialSaveVolumeDefined = false; boolIsAnySpecialSaveVolumeDefined = false;
boolIsVvvInfoRequested = false; boolIsVvvInfoRequested = false;
boolMuonEventReweighting = false; boolMuonEventReweighting = false;
boolCalculateFieldIntegral = false; boolCalculateFieldIntegral = false;
myRootOutput = musrRootOutput::GetRootInstance(); myRootOutput = musrRootOutput::GetRootInstance();
if (myRootOutput == NULL) { if (myRootOutput == NULL) {
musrErrorMessage::GetInstance()->musrError(FATAL, musrErrorMessage::GetInstance()->musrError(FATAL,
"musrSteppingAction::musrSteppingAction(): pointer to the musrRootOutput class not found! ==> EXECUTION STOPPED",true); "musrSteppingAction::musrSteppingAction(): pointer to the musrRootOutput class not found! ==> EXECUTION STOPPED",true);
} }
lastActualVolume="Unset"; lastActualVolume="Unset";
} }
musrSteppingAction::~musrSteppingAction() { musrSteppingAction::~musrSteppingAction() {
@ -140,7 +150,7 @@ void musrSteppingAction::UserSteppingAction(const G4Step* aStep) {
} }
// Save info about the old tracks, if the user wish to have Vvv info in the output Root Tree. // Save info about the old tracks, if the user wishes to have Vvv info in the output Root Tree.
if (boolIsVvvInfoRequested) { if (boolIsVvvInfoRequested) {
G4VPhysicalVolume* nextVolume = aTrack->GetNextVolume(); G4VPhysicalVolume* nextVolume = aTrack->GetNextVolume();
if (nextVolume!=NULL) { if (nextVolume!=NULL) {
@ -375,6 +385,7 @@ void musrSteppingAction::UserSteppingAction(const G4Step* aStep) {
} }
} }
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
@ -472,3 +483,17 @@ G4bool musrSteppingAction::AreTracksCommingFromSameParent(G4int trackID1, G4int
// G4cout<<"\t\t\t\ttrack1="<<track1<<"\ttrack2="<<track2<<G4endl; // G4cout<<"\t\t\t\ttrack1="<<track1<<"\ttrack2="<<track2<<G4endl;
return false; return false;
} }
// //Double_t musrSteppingAction::poissonf(Double_t* x, Double_t* par)
// //{
//Double_t musrSteppingAction::poissonf(Double_t* x, Double_t* par) {
// // if (x<0)
// // return 0;
// // else if (x == 0.0)
// // return 1./Math::Exp(par);
// // else {
// // Double_t lnpoisson = x*log(par)-par-LnGamma(x+1.);
// // return Exp(lnpoisson);
// // }
// return par[0]*TMath::Poisson(x[0],par[1]);
//}