| 1 | #ifndef caloelectron_h | 
| 2 | #define caloelectron_h | 
| 3 |  | 
| 4 |  | 
| 5 | #if !defined(__CINT__) || defined(__MAKECINT__) | 
| 6 |  | 
| 7 | #include <PamLevel2.h> | 
| 8 |  | 
| 9 | //#include <TMinuit.h> | 
| 10 | #include <TPaveStats.h> | 
| 11 | #include <TStyle.h> | 
| 12 | #include <TSystem.h> | 
| 13 | #include <TCanvas.h> | 
| 14 | #include <TGraphErrors.h> | 
| 15 | #include <TH1F.h> | 
| 16 | #include <TF2.h> | 
| 17 | #include <TH2F.h> | 
| 18 | #include <TProfile.h> | 
| 19 | #include <TBenchmark.h> | 
| 20 |  | 
| 21 | #include <iostream> | 
| 22 | #include <iomanip> | 
| 23 | using namespace std; | 
| 24 |  | 
| 25 | #endif | 
| 26 |  | 
| 27 | //CaloLevel1* cl1; | 
| 28 |  | 
| 29 | #define NTAUBINMAX 100 | 
| 30 |  | 
| 31 | #define WX0 0.350 //cm | 
| 32 | #define WTICK 0.26 //cm | 
| 33 | #define PITCH 0.244 //cm | 
| 34 | #define DEAD 0.096 //cm | 
| 35 | #define GLUE 0.05  //cm | 
| 36 |  | 
| 37 | #define CALIBNBIN 600 | 
| 38 | #define CALIBRANGE 15.//cm | 
| 39 |  | 
| 40 | double fradpro(Double_t *xi, Double_t *parmin); | 
| 41 |  | 
| 42 | /////////////////////////////////////////////////// | 
| 43 | /// | 
| 44 | /// | 
| 45 | ///  CLASS FOR INITIALIZATIONS & PARAMETERS | 
| 46 | /// | 
| 47 | /// | 
| 48 | /////////////////////////////////////////////////// | 
| 49 |  | 
| 50 | class CaloElectron_parameters : public TObject{ | 
| 51 |  | 
| 52 | private: | 
| 53 |  | 
| 54 | CaloElectron_parameters(){ SetDefault(); }; | 
| 55 |  | 
| 56 | static CaloElectron_parameters * _parameters; | 
| 57 |  | 
| 58 | public: | 
| 59 |  | 
| 60 | static CaloElectron_parameters *Get(){ | 
| 61 | if(_parameters==0) { | 
| 62 | //          cout << "**NEW**"<<endl; | 
| 63 | _parameters = new CaloElectron_parameters(); | 
| 64 | } | 
| 65 | return _parameters; | 
| 66 | } | 
| 67 |  | 
| 68 | // ------ | 
| 69 | //general | 
| 70 | // ------ | 
| 71 |  | 
| 72 | bool debug; | 
| 73 |  | 
| 74 | int isimu;     //simulation flag | 
| 75 | int dolongfit; //longitudinal-fit flag | 
| 76 | int dolatcorr; //lateral-correction flag | 
| 77 | int calibmode; //calibration flag | 
| 78 |  | 
| 79 | float TAUMAX;  // max longitudinal depth to evaluate qtot (TAU=t/T) | 
| 80 | float RMAX;    // max radius around the track to evaluate qtot | 
| 81 |  | 
| 82 | float RMAXsp;  // radius around the track to integrate the profile | 
| 83 |  | 
| 84 | int ipmin; // first plane (0-21) | 
| 85 | int ipmax; // last plane (0-21) | 
| 86 |  | 
| 87 | bool maskpl[22][2];  // plane masks | 
| 88 |  | 
| 89 | CaloLevel1* cl1; | 
| 90 |  | 
| 91 | // ----------------------- | 
| 92 | // plots of energy deposit | 
| 93 | // ----------------------- | 
| 94 | TH2F *h_qtot[2]; //matrix of energy deposits (measured) 192x22 | 
| 95 | TH2F *h_qfit[2]; //matrix of energy deposits (fit) 192x22 | 
| 96 |  | 
| 97 | // -------------------------------------- | 
| 98 | // parameters for lateral profile (fixed) | 
| 99 | // -------------------------------------- | 
| 100 |  | 
| 101 | float file_rt[12][3]; | 
| 102 | float file_rc[12][3]; | 
| 103 | float file_p[12][3]; | 
| 104 | float file_tau[12]; | 
| 105 |  | 
| 106 | void Dump(); | 
| 107 |  | 
| 108 | void SetCalo(int icalo,int notused); | 
| 109 | void SetPar(); | 
| 110 | void SetPar(TString pathx,TString pathyd,TString pathyp); | 
| 111 | void SetRMAX(float setRMAX)    {RMAX   = setRMAX;}; | 
| 112 | void SetRMAXsp(float setRMAX)  {RMAXsp = setRMAX;}; | 
| 113 | void SetTAUMAX(float setTAUMAX){TAUMAX = setTAUMAX;}; | 
| 114 | void Setsimu(int isetsimu)     {isimu=isetsimu; SetPar();}; | 
| 115 | void SetLongitudinalFit(int isetdolongfit) {dolongfit = isetdolongfit;}; | 
| 116 | void SetLateralCorrection(int isetdolatcorr) {dolatcorr = isetdolatcorr;}; | 
| 117 | void SetCalibrationMode(int icalibmode){calibmode=icalibmode;}; | 
| 118 | void SetDebug(bool isetdebug)        {debug = isetdebug;}; | 
| 119 | // | 
| 120 | void SetCaloLevel1(CaloLevel1 *cl1in)  {cl1 = cl1in; }; | 
| 121 |  | 
| 122 | void SetDefault(); | 
| 123 |  | 
| 124 |  | 
| 125 | // -------------------------------------- | 
| 126 | // tools for calibration (NTAUBINMAX) | 
| 127 | // -------------------------------------- | 
| 128 | // | 
| 129 | TH2F *h_qtot_tau[100][3];///< profile histos for x,yodd,yeven | 
| 130 | TH1F *h_qtot_tau_wav[100][3];///< profile histos for x,yodd,yeven (weighted average) | 
| 131 | double summW[100][3][1000]; | 
| 132 | double summWF[100][3][1000]; | 
| 133 | // | 
| 134 | float par_rt[100][3]; | 
| 135 | float par_rc[100][3]; | 
| 136 | float par_p[100][3]; | 
| 137 | int   par_ntau; | 
| 138 | float par_taubin[101]; | 
| 139 | // | 
| 140 | void Calibration_SetTools(); | 
| 141 | void Calibration_SetTools(int ntau, float* taubin); | 
| 142 | void Calibration_Fit(); | 
| 143 | void Calibration_Save(TFile* file); | 
| 144 | void Calibration_Load(TFile* file); | 
| 145 |  | 
| 146 | ClassDef(CaloElectron_parameters,2); | 
| 147 |  | 
| 148 | }; | 
| 149 |  | 
| 150 | /////////////////////////////////////////////////// | 
| 151 | /// | 
| 152 | /// | 
| 153 | ///  CLASS INPLEMENTATION | 
| 154 | /// | 
| 155 | /// | 
| 156 | /////////////////////////////////////////////////// | 
| 157 | class CaloElectron : public TObject{ | 
| 158 |  | 
| 159 | private: | 
| 160 |  | 
| 161 | public: | 
| 162 |  | 
| 163 |  | 
| 164 | // ----------- | 
| 165 | // shower axis | 
| 166 | // ----------- | 
| 167 | float trkcoordx[22][2]; ///< track coordinates (PAMELA r.s.) | 
| 168 | float trkcoordy[22][2]; ///< track coordinates (PAMELA r.s.) | 
| 169 | float trkstrip[22][2]; ///< strip traversed by the track | 
| 170 | float tgx,tgy,tg; | 
| 171 | // -------------- | 
| 172 | // energy deposit | 
| 173 | // -------------- | 
| 174 | float qtot;            ///< total collected charge | 
| 175 | float qplane0[22][2];  ///< collected charge (within RMAX & TAUMAX) | 
| 176 | float qplane1[22][2];  ///< corrected charge (lateral leakage & gaps) | 
| 177 | float qplanefit[22][2];  ///< fitted values | 
| 178 | float tplane[22][2];   ///< shower depth (in units of radiation lenth) | 
| 179 | // -------------------------------- | 
| 180 | // parameters from longitudinal fit | 
| 181 | // -------------------------------- | 
| 182 | float chi2__l;    // output longitudinal fit (chi2) | 
| 183 | float par__l[4];  // parameters (E,alpha,T,t0) | 
| 184 | int   err__l; // minuit flag (0=ok ecc...) | 
| 185 | float corr__l;      // longitudinal correction factor | 
| 186 |  | 
| 187 | float chi2;      ///< global chi2 (lateral+longitudinal) | 
| 188 |  | 
| 189 | // -------------- | 
| 190 | // new variables | 
| 191 | // -------------- | 
| 192 | float RMS[22][2]; | 
| 193 | float SKEW[22][2]; | 
| 194 | float KURT[22][2]; | 
| 195 | float TAU[22][2]; | 
| 196 |  | 
| 197 |  | 
| 198 | CaloElectron(){ Reset(); }; | 
| 199 | CaloElectron(PamLevel2 *l2, int ntr){ Reset(); Set(l2,ntr); }; | 
| 200 |  | 
| 201 | /*     CaloElectron(){ Reset(); SetDefault(); SetPar(); }; */ | 
| 202 | /*     CaloElectron(PamLevel2 *l2, int ntr){ Reset(); SetPar(); Set(l2,ntr); SetDefault();}; */ | 
| 203 | /*     CaloElectron(PamLevel2 *l2){ Reset(); SetPar(); Set(l2); SetDefault();}; */ | 
| 204 |  | 
| 205 | ~CaloElectron(){ Reset(); }; | 
| 206 |  | 
| 207 | void Reset(); | 
| 208 | void Clear(){ Reset(); }; | 
| 209 | void Delete(){ Reset(); }; | 
| 210 |  | 
| 211 | bool Set(CaloLevel1*,float tracoo[][2]);//main set | 
| 212 | bool Set(CaloLevel1*,CaloTrkVar*); | 
| 213 | bool Set(PamLevel2*,int); | 
| 214 |  | 
| 215 | //    bool Set(PamLevel2* l2){ return Set(l2,0); }; | 
| 216 | //    bool Set(CaloLevel1*,float tracoo[][2]); | 
| 217 | //    bool Set(CaloLevel1*,CaloLevel2*); | 
| 218 |  | 
| 219 | // ------------------------------------- | 
| 220 | // methods to perform lateral correction | 
| 221 | // ------------------------------------- | 
| 222 | double GetLateralCorrection(double,double,int,int); | 
| 223 | double GetLateralCorrection(double,double,TF2*,int); | 
| 224 | float  ApplyLateralCorrection(float); | 
| 225 | void   GetProfile(int,int,float xx[],float qq[],float errxx[],float errqq[]); | 
| 226 | //    float GetLateralFactor(){return corr;}; | 
| 227 | TGraphErrors* GetGraph_Lateral(int, int); | 
| 228 | TGraphErrors* GetFunc_Lateral(int,int); | 
| 229 | // ------------------------------------------ | 
| 230 | // methods to perform longitudinal correction | 
| 231 | // ------------------------------------------ | 
| 232 | int   ApplyLongitudinalFit(int longto);//return the ierflg value of gminuit minimization | 
| 233 | float GetLongitudinalCorrection(); | 
| 234 | //    float GetLongitudinalFactor(){return corr__l;}; | 
| 235 | //    float GetLongitudinalFcnout(){return chi2__l;}; | 
| 236 | float GetIerflg(){return err__l;}; | 
| 237 | TGraphErrors* GetGraph_Longitudinal(); | 
| 238 | TGraphErrors* GetGraph_Longitudinal_Fit(); | 
| 239 | TGraphErrors* GetGraph_Longitudinal_Integral(); | 
| 240 | TGraphErrors* GetGraph_Longitudinal_Integral_Fit(); | 
| 241 | TF1*          GetFunc_Longitudinal(); | 
| 242 | float         GetMaxResidual(); | 
| 243 | int           GetNRun(); | 
| 244 | float         GetMaxRun(); | 
| 245 | // ------------------------------------ | 
| 246 | // other methods | 
| 247 | // ------------------------------------ | 
| 248 | float ProfileTest(); | 
| 249 | void  GetCornerCoord(int,int,float&,float&); | 
| 250 | void  Print(); | 
| 251 | int   GetNWLayers(int ip,int iv){ return ip+(1-iv);}; ///< n.W-layers above an active layer | 
| 252 | // ------------------------------------ | 
| 253 | // methods to get some shower variables | 
| 254 | // ------------------------------------ | 
| 255 | float GetQ(int icorr);           ///< shower charge (within RMAX and TAUMAX) | 
| 256 | float GetQ(){ return GetQ(1); }; ///< shower charge (within RMAX and TAUMAX) | 
| 257 | float GetQView(int icorr,int iv);///< shower charge on x or y view | 
| 258 | /*     float GetQW(int icorr,int iw);            */ | 
| 259 | /*     float GetQW(int icorr,int iw,int iv);    */ | 
| 260 | /*     float GetQipiv(int icorr,int ip,int iv);       */ | 
| 261 | float GetEnergy(int icorr);      ///< shower energy | 
| 262 | float GetEnergy(){ return GetEnergy(1); };///< shower energy | 
| 263 | float GetShowerMaximum(float qplane[][2]); | 
| 264 | float GetShowerMaximum(int icorr);///< shower maximum (in units of W-layers) | 
| 265 | float GetShowerMaximumX0(int icorr);///< shower maximum (in units of X0) | 
| 266 | float GetShowerMaximumView(int view,float qplane[][2]); | 
| 267 | float GetShowerMaximumView(int view,int icorr);///< shower maximum (in units of W-layers) | 
| 268 | float GetShowerMaximumViewX0(int view,int icorr);///< shower maximum (in units of X0) | 
| 269 | /*     float GetStripMaximum(int iv,int icorr);///< strip traversed by track on maximum plane */ | 
| 270 | /*     float GetCoordMaximum(int iv,int icorr);///< coordinate traversed by track on maximum plane */ | 
| 271 | /*     float GetStripW(int iw,int iv);///< coordinate traversed by track after iw tungsten planes */ | 
| 272 | /*     float GetCoordW(int iw,int iv,int ixy);///< coordinate traversed by track after iw tungsten planes */ | 
| 273 | /*     float GetmaxStrip(int ip,int iv); */ | 
| 274 |  | 
| 275 |  | 
| 276 | bool IsInsideFiducial(int level); | 
| 277 |  | 
| 278 | // ------------------------------------ | 
| 279 | // methods to perform calibration | 
| 280 | // ------------------------------------ | 
| 281 | void Calibration_Fill(); | 
| 282 |  | 
| 283 |  | 
| 284 | ClassDef(CaloElectron,4); | 
| 285 |  | 
| 286 | }; | 
| 287 |  | 
| 288 |  | 
| 289 |  | 
| 290 | #endif |