| 1 |
|
| 2 |
|
| 3 |
/** |
| 4 |
* \file ToFdEdx_patch.h |
| 5 |
* \authors Rita Carbone & Lucia Consiglio & Wolfgang Menn |
| 6 |
*/ |
| 7 |
#ifndef tofdEdx_patch_h |
| 8 |
#define tofdEdx_patch_h |
| 9 |
|
| 10 |
#include <PamLevel2.h> |
| 11 |
|
| 12 |
#include <TTree.h> |
| 13 |
#include <TFriendElement.h> |
| 14 |
#include <TChain.h> |
| 15 |
#include <TFile.h> |
| 16 |
#include <TList.h> |
| 17 |
#include <TF1.h> |
| 18 |
#include <TKey.h> |
| 19 |
#include <TSystemFile.h> |
| 20 |
#include <TSystemDirectory.h> |
| 21 |
#include <TSQLServer.h> |
| 22 |
|
| 23 |
#include <iostream> |
| 24 |
|
| 25 |
using namespace std; |
| 26 |
|
| 27 |
|
| 28 |
class ToF_geometry : public TObject { |
| 29 |
|
| 30 |
private: |
| 31 |
TArrayI ePlane, eXY; |
| 32 |
|
| 33 |
public: |
| 34 |
ToF_geometry() { |
| 35 |
int plane[24] = { |
| 36 |
0, 0, 0, 0, 0, 0, 0, 0, |
| 37 |
1, 1, 1, 1, 1, 1, |
| 38 |
2, 2, |
| 39 |
3, 3, |
| 40 |
4, 4, 4, |
| 41 |
5, 5, 5 |
| 42 |
}; |
| 43 |
int plXY[6]= { 2, 1, 1, 2, 2, 1 }; // X==1, Y==2 */ |
| 44 |
ePlane.Set(24,plane); |
| 45 |
eXY.Set(6,plXY); |
| 46 |
} |
| 47 |
|
| 48 |
int GetPad( int idpmt) { return (int)((idpmt+0.5)/2.); } |
| 49 |
int GetPlane( int idpmt) { return ePlane[ GetPad(idpmt) ]; } |
| 50 |
int GetXY( int idpmt) { return eXY[ GetPlane(idpmt) ]; } |
| 51 |
|
| 52 |
ClassDef(ToF_geometry,1); |
| 53 |
|
| 54 |
}; |
| 55 |
|
| 56 |
/** |
| 57 |
* |
| 58 |
* Class to store and calculate variables useful for nuclei analysis |
| 59 |
*/ |
| 60 |
class ToFdEdx_patch : public TObject { //class definition |
| 61 |
|
| 62 |
private: |
| 63 |
// |
| 64 |
PamLevel2 *L2; |
| 65 |
Int_t eNtr; // number of tracker tracks |
| 66 |
const char* trkAlg; |
| 67 |
|
| 68 |
ToF_geometry eGeom; // ToF geometry |
| 69 |
// |
| 70 |
|
| 71 |
UInt_t OBT; |
| 72 |
UInt_t PKT; |
| 73 |
UInt_t atime; |
| 74 |
Int_t tr; |
| 75 |
|
| 76 |
Float_t adc_he; |
| 77 |
|
| 78 |
// ToF track dependent |
| 79 |
TArrayF eDEDXpmt; // 0-47 pmt dEdx |
| 80 |
TArrayF eZpmt; // 0-47 pmt charge |
| 81 |
TArrayF eDEDXpad; // 0-23 paddle dEdx |
| 82 |
TArrayF eZpad; // 0-23 paddle charge |
| 83 |
TArrayF eDEDXlayer; // 0-5 layer dEdx |
| 84 |
TArrayF eZlayer; // 0-5 layer charge |
| 85 |
TArrayF eDEDXplane; // 0-2 plane dEdx |
| 86 |
TArrayF eZplane; // 0-2 plane charge |
| 87 |
|
| 88 |
TArrayF INFOpmt; // 0-47 pmt status |
| 89 |
TArrayF INFOlayer; //0-5 layer status |
| 90 |
|
| 91 |
|
| 92 |
|
| 93 |
// ToF standalone |
| 94 |
TArrayF eDEDXpmtstd; // 0-47 pmt dEdx |
| 95 |
TArrayF eZpmtstd; // 0-47 pmt charge |
| 96 |
TArrayF eDEDXpadstd; // 0-23 paddle dEdx |
| 97 |
TArrayF eZpadstd; // 0-23 paddle charge |
| 98 |
TArrayF eDEDXlayerstd; // 0-5 layer dEdx |
| 99 |
TArrayF eZlayerstd; // 0-5 layer charge |
| 100 |
TArrayF INFOpmtstd; // 0-47 pmt status |
| 101 |
TArrayF INFOlayerstd; //0-5 layer status |
| 102 |
|
| 103 |
// parameters: |
| 104 |
TArrayF PMTsat; // 0-47 saturation parameters |
| 105 |
|
| 106 |
|
| 107 |
TArrayF A0_array[100]; // 48 x 100 define an array of 48 elements per each time interval |
| 108 |
TArrayF A1_array[100]; |
| 109 |
TArrayF A2_array[100]; |
| 110 |
TArrayF A3_array[100]; |
| 111 |
TArrayF A4_array[100]; |
| 112 |
TArrayF A5_array[100]; |
| 113 |
|
| 114 |
Float_t A0[48]; |
| 115 |
Float_t A1[48]; |
| 116 |
Float_t A2[48]; |
| 117 |
Float_t A3[48]; |
| 118 |
Float_t A4[48]; |
| 119 |
Float_t A5[48]; |
| 120 |
|
| 121 |
UInt_t T_int_min[100]; |
| 122 |
UInt_t T_int_max[100]; |
| 123 |
UInt_t tmin_atten,tmax_atten; |
| 124 |
Int_t ical_atten; |
| 125 |
|
| 126 |
TArrayF dedx_corr_mp[3500]; // 48 x 3500 define an array of 48 elements per each time interval |
| 127 |
TArrayF dedx_corr_mhe[3500]; // 48 x 3500 define an array of 48 elements per each time interval |
| 128 |
TArrayF dedx_corr_mc[3500]; // 48 x 3500 define an array of 48 elements per each time interval |
| 129 |
|
| 130 |
UInt_t mtime[3500]; |
| 131 |
Int_t ical_2nd; |
| 132 |
UInt_t tmin_2nd,tmax_2nd; |
| 133 |
|
| 134 |
|
| 135 |
// TArrayF TDx[48]; // 200 x 48 define an array of 200 elements per each pmt |
| 136 |
// TArrayF TDy[48]; |
| 137 |
// TArrayF parAtt[48]; // 48 x 6 |
| 138 |
|
| 139 |
TArrayF parPos[48]; // 48 x 4 |
| 140 |
TArrayF parDesatBB[48]; // 48 x 3 |
| 141 |
TArrayF parBBneg[48]; // 48 x 3 |
| 142 |
TArrayF parBBpos; // 48 x 1 |
| 143 |
TArrayF parBBpol4[48]; // 48 x 5 for pol4 parameters |
| 144 |
|
| 145 |
|
| 146 |
public: |
| 147 |
ToFdEdx_patch() {Clear();} // class constructor |
| 148 |
~ToFdEdx_patch(){ Delete(); }; // class distructor |
| 149 |
// |
| 150 |
void Clear(Option_t *option=""); |
| 151 |
void Delete(Option_t *option="") { Clear(); } |
| 152 |
|
| 153 |
// void InitPar(const char *pardir); // init parameters |
| 154 |
void InitPar(const char *pardir, const char *param); // init parameters |
| 155 |
|
| 156 |
void Define_PMTsat(); |
| 157 |
// void ReadParTD( Int_t ipmt, const char *fname ); |
| 158 |
|
| 159 |
void ReadParAtt(const char *pardir, const char *param); |
| 160 |
// void ReadParAtt( const char *fname, const char *param ); |
| 161 |
void ReadParPos( const char *fname ); |
| 162 |
void ReadParBBneg( const char *fname ); |
| 163 |
void ReadParBBpos( const char *fname ); |
| 164 |
void ReadParDesatBB( const char *fname ); |
| 165 |
void ReadParBBpol4( const char *fname ); |
| 166 |
|
| 167 |
|
| 168 |
|
| 169 |
// void Process( PamLevel2 *l2p, Int_t itr=0 ); ///< Process data for track number itr |
| 170 |
void Process( PamLevel2 *l2p, const char* alg, const char *tri_or_bi ); ///< Process data 10th red |
| 171 |
void Print(Option_t *option=""); |
| 172 |
void PrintTD(); |
| 173 |
|
| 174 |
// track dependent results |
| 175 |
|
| 176 |
Float_t GetdEdx_pmt(Int_t ipmt) { return eDEDXpmt[ipmt]; } // 0-47 dEdx for each PMT for tracked events |
| 177 |
Float_t GetCharge_pmt(Int_t ipmt) {return eZpmt[ipmt];} // 0-47 Z for each PMT for tracked events |
| 178 |
Float_t GetdEdx_pad(Int_t ipad) {return eDEDXpad[ipad];} // 0-23 dEdx for each paddle for tracked events (no request of consistency between PMT's response when both on!) |
| 179 |
Float_t GetCharge_pad(Int_t ipad) {return eZpad[ipad];} // 0-23 Z for each paddle for tracked events (no request of consistency) |
| 180 |
Float_t GetdEdx_layer(Int_t ilay) {return eDEDXlayer[ilay];} // 0-5 dEdx for each layer for tracked events |
| 181 |
Float_t GetCharge_layer(Int_t ilay) {return eZlayer[ilay];} // 0-5 Z for each layer for tracked events |
| 182 |
|
| 183 |
|
| 184 |
|
| 185 |
// ToF standalone results |
| 186 |
Float_t GetdEdx_pmtstd(Int_t ipmt) { return eDEDXpmtstd[ipmt]; } // 0-47 dEdx for each PMT for tracked events |
| 187 |
Float_t GetCharge_pmtstd(Int_t ipmt) {return eZpmtstd[ipmt];} // 0-47 Z for each PMT for tracked events |
| 188 |
Float_t GetdEdx_padstd(Int_t ipad) {return eDEDXpadstd[ipad];} // 0-23 dEdx for each paddle for tracked events (no request of consistency between PMT's response when both on!) |
| 189 |
Float_t GetCharge_padstd(Int_t ipad) {return eZpadstd[ipad];} // 0-23 Z for each paddle for tracked events (no request of consistency) |
| 190 |
Float_t GetdEdx_layerstd(Int_t ilay) {return eDEDXlayerstd[ilay];} // 0-5 dEdx for each layer for tracked events |
| 191 |
Float_t GetCharge_layerstd(Int_t ilay) {return eZlayerstd[ilay];} // 0-5 Z for each layer for tracked events |
| 192 |
|
| 193 |
|
| 194 |
|
| 195 |
Float_t GetInfo_pmt(Int_t ipmt) {return INFOpmt[ipmt];} // 0-47 pmt status |
| 196 |
|
| 197 |
/* INFOpmt table: |
| 198 |
|
| 199 |
INFOpmt[ii]=0 ---> everithing is ok! |
| 200 |
INFOpmt[ii]=1 ---> beta not good (<0.05 || >2) |
| 201 |
INFOpmt[ii]=2 ---> PMT OFF |
| 202 |
INFOpmt[ii]=3 ---> PMT saturated |
| 203 |
INFOpmt[ii]=4 ---> error during the correction for the incidence angle |
| 204 |
INFOpmt[ii]=5 ---> error during the correction for the dependence on the position |
| 205 |
INFOpmt[ii]=6 ---> error in dEdx reconstruction |
| 206 |
INFOpmt[ii]=7 ---> error in Z reconstruction |
| 207 |
*/ |
| 208 |
|
| 209 |
Float_t GetInfo_layer(Int_t ilay) {return INFOlayer[ilay];} // 0-5 layer status |
| 210 |
|
| 211 |
/* INFOlayer table: |
| 212 |
|
| 213 |
INFOlayer[ii]=0 ---> everithing is ok! |
| 214 |
INFOlayer[ii]=1 ---> beta not good (<0.05 || >2) |
| 215 |
INFOlayer[ii]=2 ---> only one PMT is OFF (but you get the other one to have the measurement) |
| 216 |
INFOlayer[ii]=3 ---> only one PMT is saturated (but you get the other one to have the measurement) |
| 217 |
INFOlayer[ii]=4 ---> only one PMT with a wrong reconstruction (but you get the other one to have the measurement) |
| 218 |
INFOlayer[ii]=5 ---> the 2 PMTs involved give different measurement (actually they differ for more then 1.5, to be tuned...) |
| 219 |
INFOlayer[ii]=6 ---> saturated layer (both PMTs) |
| 220 |
INFOlayer[ii]=7 ---> all PMTs show some error during reconstruction |
| 221 |
INFOlayer[ii]=8 ---> 1 PMT is OFF and 1 is saturated (it happens quiet only on S115...) |
| 222 |
INFOlayer[ii]=9 ---> OFF layer |
| 223 |
*/ |
| 224 |
|
| 225 |
private: |
| 226 |
double f_adcPC( float x ); |
| 227 |
|
| 228 |
double f_BB( TArrayF &p, float x ); |
| 229 |
double f_BBpol4( TArrayF &p, float x ); |
| 230 |
|
| 231 |
double f_BB5B( float x ); |
| 232 |
double f_BB5Bpol4( float x ); |
| 233 |
|
| 234 |
|
| 235 |
// double f_att( TArrayF &p, float x ) ; |
| 236 |
double f_att(float C0, float C1, float C2, float C3, float C4, float C5, float x ) ; |
| 237 |
double f_att5B( float x ); |
| 238 |
double f_desatBB( TArrayF &p, float x ); |
| 239 |
double f_desatBB5B( float x ); |
| 240 |
double f_pos( TArrayF &p, float x ); |
| 241 |
double f_pos5B( float x ); |
| 242 |
// float Get_adc_he( int id, float pl_x[6], float pl_y[6]); |
| 243 |
float Get_adc_he( int id, float x); |
| 244 |
|
| 245 |
|
| 246 |
|
| 247 |
|
| 248 |
ClassDef(ToFdEdx_patch,1); |
| 249 |
}; |
| 250 |
|
| 251 |
#endif |
| 252 |
|