Skip to content

WCSim PMT tilt implemented on a per-PMT basis - #25

Open
S81D wants to merge 3 commits into
ANNIEsoft:anniefrom
S81D:Indy_tilt_merge
Open

WCSim PMT tilt implemented on a per-PMT basis#25
S81D wants to merge 3 commits into
ANNIEsoft:anniefrom
S81D:Indy_tilt_merge

Conversation

@S81D

@S81D S81D commented Jun 12, 2026

Copy link
Copy Markdown

Very similar to PR #24 that was closed, and includes PMT tilting + LAPPD changes by Yue. Rather than applying a global tilt angle to the WB + WM PMTs, I have added an additional column in PMTPositions_Scan.txt where the user can edit the individual PMT tilt angles based on GoPro observations / other data analyses.

Right now all affected PMT tilt values are set to 53 degrees, which is consistent with what James and I have used in our CC and NC cross section analyses.

There are two limitations that should be added but unfortunately I don't have a ton of time to address them - I will try my best to fix them either in this PR or in another in the future:

  • (see comment I opened below)
  • Ideally we add a config option that gives the user the power to toggle the tilting on / off, especially as we progress to future tuning campaigns using comparisons of the FY26 fixed PMT data vs previous beam data with the tilting.
  • I encountered the same issue as James with the git hash problem that caused the PR WCSim Tilt update - Version used for MC Production #24 to close, but have removed it in this PR. It would be great if someone could remedy this problem and validate this branch.

G4ThreeVector PMTPosition_tilt(pmt_x_shift,pmt_y_shift,tilt_pmt_z_shift);

// only rotate the affected PMTs (ignore Top, Bottom, and ANNIE Hamamatsu PMTs)
if ((pmt_type == 3)||(pmt_type == 0 && panel_nr != 0)){

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I kept the logic of only applying the angles to the affected PMT populations. This can probably be dropped however there's no reason to tilt the Top/Bottom/Hamamatsu PMTs.

pmt_y_shift = (168.1-pmt_z)*cm;
pmt_z_shift = ((pmt_y+14.45))*cm;
//pmt_z_shift = ((pmt_y+14.45)-InnerStructureCentreOffset/10.)*cm;
tilt_pmt_z_shift = (pmt_y+14.45+13.9)*cm;

@marc1uk marc1uk Aug 3, 2026

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

why was this 13cm offset added in?
is it angle-dependent?

double verticalSpacingLAPPD = mainAnnulusHeight/(WCLAPPDperCellVertical+1);

//G4cout<<"verticalSpacingLAPPD was: " << verticalSpacingLAPPD <<G4endl;
verticalSpacingLAPPD = 550;

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

can we get a comment on why the hard-coded change?

Comment thread src/WCSimLAPPDObject.cc
//static G4float wavelength_value[20] = { 280., 300., 320., 340., 360., 380., 400., 420., 440., 460., 480., 500., 520., 540., 560., 580., 600., 620., 640., 660.};

// wavelength bin for LAPPD 25 for 40
static G4float wavelength_value[20] = {220., 240., 260., 280., 300., 320., 340., 360., 380., 400., 420., 440., 460., 480., 500., 520., 540., 560., 580., 600.};

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

it probably ought to be mentioned in the git commit logs if this is altering PMT quantum efficiency responses as well....

Comment thread src/WCSimLAPPDObject.cc

G4float* LAPPD::GetQE(){
// new data from LAPPD 25 for 40
static G4float QE[20] = {0.02937435, 0.06062565, 0.09187696 , 0.12312826 , 0.15437956 , 0.18471379 , 0.21641814 , 0.2428098 , 0.24469183 , 0.22234098 , 0.207122 ,0.19884722 , 0.17932031 , 0.14470496 ,0.1113269 , 0.09028386 , 0.07672619 ,0.06275337 , 0.05160584 , 0.03901694};

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

...and LAPPDs....

Comment thread src/WCSimLAPPDObject.cc
G4float LAPPD::GetmaxQE(){
const G4float maxQE = 0.15; //for LAPPDs //0.211; if for PMTs

const G4float maxQE = 0.25; //for LAPPDs //0.211; if for PMTs

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this is also likely to impact LAPPD response potentially significantly (althought it looks like the previous value was too low... i'm not sure why it's even a constant, it probably ought to be calculated).

// Barrel PMTs have panel numbers 1-8
for(int facei=0; facei<WCBarrelRingNPhi; facei++){
G4RotationMatrix* WCPMTRotationNext = new G4RotationMatrix(*WCPMTRotation);
G4RotationMatrix* WCPMTtiltRotationNext = new G4RotationMatrix(*WCPMTRotation);

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this has the same memory leaks james' version did...



//G4cout<< -mainAnnulusHeight/2. << " " << (j-1.)*verticalSpacingLAPPD<< G4endl;
G4ThreeVector LAPPDPosition = G4ThreeVector(CellCentreX, CellCentreY, -119.2+(j-1.)*verticalSpacingLAPPD);

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this has also had a change to hard-coded value....
WCSim was originally designed to be generative geometry - it has configuration options for variables such as detector height, diameter, cell size etc, and it builds a geometry from that.
We subverted it somewhat by adding an alternative means to place PMTs from a list of positions in file.
But hard-coded values are neither, and should not really be in here....

G4RotationMatrix* WCPMTtiltRotationNext = new G4RotationMatrix(*WCPMTRotation);
WCPMTRotationNext->rotateX((dPhi*facei)-67.5*deg+180*deg);
WCPMTtiltRotationNext->rotateX((dPhi*facei)-67.5*deg+180*deg);
WCPMTtiltRotationNext->rotateY(-53*deg);

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This seems to hard-code a rotation angle of -53 degrees, which is then applied on top of the rotation angle added in from file? Why? Doesn't this mean specifying an angle of 0 will result in a tilt?

@marc1uk

marc1uk commented Aug 3, 2026

Copy link
Copy Markdown
Collaborator

(1) i agree in principle there's no reason to only apply the tilt for barrel PMTs in a per-PMT tilt specification, since one can just set those tilts to 0. Ideally we would remove it, which should be harmless if the implementation is done right.
(2) an alternative would be to provide an alternative copy of the PMTPositions_Scan.txt file, leaving the current as default with 0 tilt, and the new version having the tilts specified. This would also allow later updates to the tilt angles (especially if the current version just applies one uniform tilt).

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants