1 |
pam-mep |
1.1 |
/* |
2 |
|
|
* PitchAngleExpositionAction.cpp |
3 |
|
|
* |
4 |
|
|
* Created on: 04-april-2010 |
5 |
|
|
* Author: Vitaly Malakhov |
6 |
|
|
*/ |
7 |
|
|
|
8 |
|
|
/*! @file PitchAngleExpositionAction.cpp The PitchAngleExpositionAction class implementation file. */ |
9 |
|
|
|
10 |
|
|
#include "PitchAngleExpositionAction.h" |
11 |
|
|
#include "TMatrixD.h" |
12 |
|
|
#include "OrientationInfo.h" |
13 |
|
|
|
14 |
|
|
#define XBINS_F 3600 |
15 |
|
|
#define YBINS_F 400 |
16 |
|
|
|
17 |
|
|
PitchAngleExpositionAction::PitchAngleExpositionAction(const char *actionName, TString outFileBase, TString mode, |
18 |
|
|
bool outRoot, bool outText, TString title, bool CalcPitchExpo, UInt_t nPitchBins, Float_t lowerPitch, Float_t upperPitch) : |
19 |
|
|
Histo2DAction<Float_t> (actionName, title, outFileBase, mode, outRoot, outText), _calcPitchExpo(CalcPitchExpo), _nPitchBins(nPitchBins), _lowerPitch(lowerPitch), _upperPitch(upperPitch) { |
20 |
|
|
|
21 |
|
|
} |
22 |
|
|
|
23 |
|
|
void PitchAngleExpositionAction::OnGood(PamLevel2 *event) { |
24 |
|
|
Float_t Bx = -event->GetOrbitalInfo()->Bdown; |
25 |
|
|
Float_t By = event->GetOrbitalInfo()->Beast; |
26 |
|
|
Float_t Bz = event->GetOrbitalInfo()->Bnorth; |
27 |
|
|
OrientationInfo* PO = new OrientationInfo(); |
28 |
|
|
TMatrixD Fij = PO->ECItoGreenwich(PO->QuatoECI(event->GetOrbitalInfo()->q0,event->GetOrbitalInfo()->q1,event->GetOrbitalInfo()->q2,event->GetOrbitalInfo()->q3),event->GetOrbitalInfo()->absTime); |
29 |
|
|
TMatrixD Dij = PO->GreenwichtoGEO(event->GetOrbitalInfo()->lat,event->GetOrbitalInfo()->lon,Fij); |
30 |
|
|
TMatrixD Iij = PO->ColPermutation(Dij); |
31 |
|
|
TMatrixD Sij = Iij; |
32 |
|
|
Sij.Invert(); |
33 |
|
|
TMatrixD Nij = PO->PamelatoGEO(Sij,Bx,By,Bz); |
34 |
|
|
Float_t BZen = acos(Nij(2,0)) * TMath::RadToDeg(); |
35 |
|
|
Float_t angle = 0; |
36 |
|
|
if(Nij(0,0)!=0)angle = atan(Nij(1,0)/Nij(0,0)) * TMath::RadToDeg();else angle = 90.; |
37 |
|
|
Float_t BAz = 360. + angle; |
38 |
|
|
if(Nij(0,0) >=0 && Nij(1,0) >=0) BAz = angle; |
39 |
|
|
if(Nij(0,0)<0) BAz = 180. + angle; |
40 |
|
|
Float_t weight = event->GetTrigLevel2()->dltime[0] * 0.16 /1000.; |
41 |
|
|
Fill(BAz, BZen, weight); |
42 |
|
|
PO->Delete(); |
43 |
|
|
} |
44 |
|
|
|
45 |
|
|
void PitchAngleExpositionAction::Finalize() { |
46 |
|
|
|
47 |
|
|
Histo2DAction<Float_t>::Finalize(); |
48 |
|
|
|
49 |
|
|
if(_calcPitchExpo){ |
50 |
|
|
TH2F tmphisto; |
51 |
|
|
tmphisto.SetBins(XBINS_F,0,360,YBINS_F,140,180); |
52 |
|
|
TString tmpname = GetRootHisto()->GetName(); |
53 |
|
|
Float_t delta = (_upperPitch - _lowerPitch)/_nPitchBins; |
54 |
|
|
for(UInt_t i=0; i<_nPitchBins; i++){ |
55 |
|
|
_pitchAngleHisto.push_back(tmphisto); |
56 |
|
|
TString tmp = tmpname; |
57 |
|
|
TString tmp2 = ""; |
58 |
|
|
tmp+=i*delta; |
59 |
|
|
tmp+="_"; |
60 |
|
|
tmp+=(i+1)*delta; |
61 |
|
|
tmp+="deg"; |
62 |
|
|
for(Int_t j = 0; j<tmp.Sizeof()-1; j++){ |
63 |
|
|
if(tmp[j] == '.') tmp[j] = 'p'; |
64 |
|
|
if(tmp[j] == ' '){ |
65 |
|
|
tmp.Replace(j,1,NULL); |
66 |
|
|
j--; |
67 |
|
|
} |
68 |
|
|
} |
69 |
|
|
cout<<"size is "<<_pitchAngleHisto.size()<<"\t"<<tmp<<endl; |
70 |
|
|
_pitchAngleHisto[i].SetName(tmp); |
71 |
|
|
_pitchAngleHisto[i].SetTitle(tmp); |
72 |
|
|
cout<<"PitchHisto["<<i<<"] name is "<<_pitchAngleHisto[i].GetName()<<endl; |
73 |
|
|
} |
74 |
|
|
|
75 |
|
|
Float_t BinWidthX = GetRootHisto()->GetXaxis()->GetXmax()/GetRootHisto()->GetNbinsX(); |
76 |
|
|
Float_t BinWidthY = GetRootHisto()->GetYaxis()->GetXmax()/GetRootHisto()->GetNbinsY(); |
77 |
|
|
Float_t tetaB = 0.; //Zenith angle of Magnetic field vector B in PAMELA reference frame |
78 |
|
|
Float_t fiB = 0.; //Azimuth angle of Magnetic field vector B in PAMELA reference frame |
79 |
|
|
Float_t Psi = 0.; //Pitch-Angle; |
80 |
|
|
Float_t Ksi = 0.; //Azimuth-angle according pitch-angle Psi |
81 |
|
|
|
82 |
|
|
Bool_t pth[XBINS_F][YBINS_F]; |
83 |
|
|
for(Int_t i=1;i<=GetRootHisto()->GetNbinsX();i++){ |
84 |
|
|
cout<<i<<" of "<<GetRootHisto()->GetNbinsX()<<endl; |
85 |
|
|
for(Int_t j=1;j<=GetRootHisto()->GetNbinsY();j++){ |
86 |
|
|
if(GetRootHisto()->GetBinContent(i,j)!=0){ |
87 |
|
|
cout<<"j = "<<j<<endl; |
88 |
|
|
fiB = TMath::DegToRad()*(i*BinWidthX+BinWidthX/2); |
89 |
|
|
tetaB = TMath::DegToRad()*(j*BinWidthY+BinWidthY/2); |
90 |
|
|
for(UInt_t iPsi=0;iPsi<_nPitchBins;iPsi++){ //We suggest here that Pitch-angel bin size is 5 degrees; |
91 |
|
|
for(UInt_t ip=0;ip<XBINS_F;ip++){ |
92 |
|
|
for(UInt_t jp=0;jp<YBINS_F;jp++) pth[ip][jp]=false; |
93 |
|
|
} |
94 |
|
|
cout<<"iPsi = "<<iPsi<<endl; |
95 |
|
|
for(UInt_t jPsi=0;jPsi<delta*10;jPsi++){ //cycle inside one pitch-angle bin; |
96 |
|
|
for(UInt_t iKsi=0;iKsi<XBINS_F;iKsi++){ //cycle over azimuth angle according this Pitch-Angle; |
97 |
|
|
Psi=TMath::DegToRad()*(iPsi*5+jPsi*0.1); |
98 |
|
|
Ksi=TMath::DegToRad()*(iKsi*0.1); |
99 |
|
|
Float_t z_ = 0; |
100 |
|
|
Float_t x_ = sin(Psi)*cos(Ksi); |
101 |
|
|
Float_t y_ = sin(Psi)*sin(Ksi); |
102 |
|
|
Float_t x1 = x_*cos(tetaB)+z_*sin(tetaB); |
103 |
|
|
Float_t z1 = -x_*sin(tetaB)+z_*cos(tetaB); |
104 |
|
|
Float_t y1 = y_; |
105 |
|
|
Float_t x2 = x1*cos(fiB)+y1*sin(fiB); |
106 |
|
|
Float_t y2 = -x1*sin(fiB)+y1*cos(fiB); |
107 |
|
|
Float_t z2 = z1; |
108 |
|
|
Float_t a2 = pow(sin(Psi),2); |
109 |
|
|
Float_t b2 = 2-2*cos(Psi); |
110 |
|
|
Float_t l = 1 - sqrt(b2-a2); |
111 |
|
|
Float_t xm = l*sin(tetaB)*cos(fiB); |
112 |
|
|
Float_t ym = l*sin(tetaB)*sin(fiB); |
113 |
|
|
Float_t zm = l*cos(tetaB); |
114 |
|
|
Float_t x3 = x2 - xm; |
115 |
|
|
Float_t y3 = y2 - ym; |
116 |
|
|
Float_t z3 = z2 - zm; |
117 |
|
|
Float_t tetaDir = 0.; //tetaDir and fiDir is a direction for Pitch and Azimuth angle given in Instrumental reference frame |
118 |
|
|
if(z3!=0)tetaDir = TMath::RadToDeg()*atan(sqrt(pow(x3,2)+pow(y3,2))/z3); |
119 |
|
|
if(z3<0)tetaDir=180+tetaDir; |
120 |
|
|
if(z3==0)tetaDir=90.; |
121 |
|
|
tetaDir=180-tetaDir; |
122 |
|
|
Float_t fiDir = 0; |
123 |
|
|
if(x3!=0)fiDir = TMath::RadToDeg()*atan(TMath::Abs(y3)/TMath::Abs(x3)); |
124 |
|
|
if(x3<0 && y3>0) fiDir = 180. - fiDir; |
125 |
|
|
if(x3<0 && y3<0) fiDir+=180.; |
126 |
|
|
if(x3>0 && y3<0) fiDir = 360. - fiDir; |
127 |
|
|
if(x3==0 && y3>0) fiDir = 90.; |
128 |
|
|
if(x3==0 && y3<0) fiDir = 270.; |
129 |
|
|
if(x3<0 && y3==0) fiDir = 180.; |
130 |
|
|
|
131 |
|
|
if(!pth[(Int_t)(fiDir/0.1)+1][(Int_t)((tetaDir-140.)/0.1)+1]){ |
132 |
|
|
_pitchAngleHisto[iPsi].Fill(fiDir,tetaDir,GetRootHisto()->GetBinContent(i,j)); |
133 |
|
|
pth[(Int_t)(fiDir/0.1)+1][(Int_t)((tetaDir-140.)/0.1)+1]=true; |
134 |
|
|
}/* |
135 |
|
|
if(fiDir<=35.){ |
136 |
|
|
if(tetaDir>=158.8-0.0035*pow(fiDir,2)){ |
137 |
|
|
if(!pth[(Int_t)(fiDir/0.1)+1][(Int_t)((tetaDir-140.)/0.1)+1]){ |
138 |
|
|
_pitchAngleHisto[iPsi].Fill(fiDir,tetaDir,GetRootHisto()->GetBinContent(i,j)); |
139 |
|
|
pth[(Int_t)(fiDir/0.1)+1][(Int_t)((tetaDir-140.)/0.1)+1]=true; |
140 |
|
|
} |
141 |
|
|
} |
142 |
|
|
} |
143 |
|
|
if(fiDir>35. && fiDir<=140.){ |
144 |
|
|
if(tetaDir>=163.2-0.0035*pow(fiDir-90.,2)){ |
145 |
|
|
if(!pth[(Int_t)(fiDir/0.1)+1][(Int_t)((tetaDir-140.)/0.1)+1]){ |
146 |
|
|
_pitchAngleHisto[iPsi].Fill(fiDir,tetaDir,GetRootHisto()->GetBinContent(i,j)); |
147 |
|
|
pth[(Int_t)(fiDir/0.1)+1][(Int_t)((tetaDir-140.)/0.1)+1]=true; |
148 |
|
|
} |
149 |
|
|
} |
150 |
|
|
} |
151 |
|
|
if(fiDir>140. && fiDir<=220.){ |
152 |
|
|
if(tetaDir>=161.5-0.0035*pow(fiDir-180.,2)){ |
153 |
|
|
if(!pth[(Int_t)(fiDir/0.1)+1][(Int_t)((tetaDir-140.)/0.1)+1]){ |
154 |
|
|
_pitchAngleHisto[iPsi].Fill(fiDir,tetaDir,GetRootHisto()->GetBinContent(i,j)); |
155 |
|
|
pth[(Int_t)(fiDir/0.1)+1][(Int_t)((tetaDir-140.)/0.1)+1]=true; |
156 |
|
|
} |
157 |
|
|
} |
158 |
|
|
} |
159 |
|
|
if(fiDir>220. && fiDir<=320.){ |
160 |
|
|
if(tetaDir>=163.2-0.0035*pow(fiDir-270.,2)){ |
161 |
|
|
if(!pth[(Int_t)(fiDir/0.1)+1][(Int_t)((tetaDir-140.)/0.1)+1]){ |
162 |
|
|
_pitchAngleHisto[iPsi].Fill(fiDir,tetaDir,GetRootHisto()->GetBinContent(i,j)); |
163 |
|
|
pth[(Int_t)(fiDir/0.1)+1][(Int_t)((tetaDir-140.)/0.1)+1]=true; |
164 |
|
|
} |
165 |
|
|
} |
166 |
|
|
} |
167 |
|
|
if(fiDir>320. && fiDir<=360.){ |
168 |
|
|
if(tetaDir>=158.8-0.0035*pow(fiDir-360.,2)){ |
169 |
|
|
if(!(pth[(Int_t)(fiDir/0.1)+1][(Int_t)((tetaDir-140.)/0.1)+1])){ |
170 |
|
|
_pitchAngleHisto[iPsi].Fill(fiDir,tetaDir,GetRootHisto()->GetBinContent(i,j)); |
171 |
|
|
pth[(Int_t)(fiDir/0.1)+1][(Int_t)((tetaDir-140.)/0.1)+1]=true; |
172 |
|
|
} |
173 |
|
|
} |
174 |
|
|
}*/ |
175 |
|
|
} // end of loop over iKsi |
176 |
|
|
} // end of loop over jPsi |
177 |
|
|
} // end of loop over iPsi |
178 |
|
|
} // if(h->GetBinContent(i,j)!=0) |
179 |
|
|
} // end of loop over j |
180 |
|
|
} // end of loop over i |
181 |
|
|
TFile outRootFile((Histo2DAction<Float_t>::_outFileBase + ".root"), "UPDATE"); |
182 |
|
|
outRootFile.cd(); |
183 |
|
|
for (UInt_t i=0; i < _nPitchBins ;i++){ |
184 |
|
|
_pitchAngleHisto[i].Write(); |
185 |
|
|
cout<<i<<"\t"<<_pitchAngleHisto[i].GetName()<<endl; |
186 |
|
|
} |
187 |
|
|
outRootFile.Close(); |
188 |
|
|
|
189 |
|
|
cout<<"outFile writing"<<endl; |
190 |
|
|
} |
191 |
|
|
} |