| 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 |
} |