1 //**************************************************************************
2 // * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
4 // * Author: The ALICE Off-line Project. *
5 // * Contributors are mentioned in the code where appropriate. *
7 // * Permission to use, copy, modify and distribute this software and its *
8 // * documentation strictly for non-commercial purposes is hereby granted *
9 // * without fee, provided that the above copyright notice appears in all *
10 // * copies and that both the copyright notice and this permission notice *
11 //* appear in the supporting documentation. The authors make no claims *
12 //* about the suitability of this software for any purpose. It is *
13 //* provided "as is" without express or implied warranty. *
14 //**************************************************************************/
18 /////////////////////////////////////////////////////////////////////////////////
20 // AliTRDCalibraFillHisto
22 // This class is for the TRD calibration of the relative gain factor, the drift velocity,
23 // the time 0 and the pad response function. It fills histos or vectors.
24 // It can be used for the calibration per chamber but also per group of pads and eventually per pad.
25 // The user has to choose with the functions SetNz and SetNrphi the precision of the calibration (see AliTRDCalibraMode).
26 // 2D Histograms (Histo2d) or vectors (Vector2d), then converted in Trees, will be filled
27 // from RAW DATA in a run or from reconstructed TRD tracks during the offline tracking
28 // in the function "FollowBackProlongation" (AliTRDtracker)
29 // Per default the functions to fill are off.
32 // R. Bailhache (R.Bailhache@gsi.de)
34 //////////////////////////////////////////////////////////////////////////////////////
36 #include <TProfile2D.h>
41 #include <TObjArray.h>
46 #include <TStopwatch.h>
48 #include <TDirectory.h>
49 #include <TTreeStream.h>
54 #include "AliTRDCalibraFillHisto.h"
55 #include "AliTRDCalibraMode.h"
56 #include "AliTRDCalibraVector.h"
57 #include "AliTRDCalibraVdriftLinearFit.h"
58 #include "AliTRDcalibDB.h"
59 #include "AliTRDCommonParam.h"
60 #include "AliTRDpadPlane.h"
61 #include "AliTRDcluster.h"
62 #include "AliTRDtrack.h"
63 #include "AliTRDtrackV1.h"
64 #include "AliTRDrawStreamBase.h"
65 #include "AliRawReader.h"
66 #include "AliRawReaderDate.h"
67 #include "AliTRDgeometry.h"
68 #include "./Cal/AliTRDCalROC.h"
69 #include "./Cal/AliTRDCalDet.h"
76 ClassImp(AliTRDCalibraFillHisto)
78 AliTRDCalibraFillHisto* AliTRDCalibraFillHisto::fgInstance = 0;
79 Bool_t AliTRDCalibraFillHisto::fgTerminated = kFALSE;
81 //_____________singleton implementation_________________________________________________
82 AliTRDCalibraFillHisto *AliTRDCalibraFillHisto::Instance()
85 // Singleton implementation
88 if (fgTerminated != kFALSE) {
92 if (fgInstance == 0) {
93 fgInstance = new AliTRDCalibraFillHisto();
100 //______________________________________________________________________________________
101 void AliTRDCalibraFillHisto::Terminate()
104 // Singleton implementation
105 // Deletes the instance of this class
108 fgTerminated = kTRUE;
110 if (fgInstance != 0) {
117 //______________________________________________________________________________________
118 AliTRDCalibraFillHisto::AliTRDCalibraFillHisto()
122 ,fMcmCorrectAngle(kFALSE)
128 ,fLinearFitterOn(kFALSE)
129 ,fLinearFitterDebugOn(kFALSE)
131 ,fThresholdClusterPRF2(15.0)
132 ,fLimitChargeIntegration(kFALSE)
133 ,fFillWithZero(kFALSE)
134 ,fNormalizeNbOfCluster(kFALSE)
137 ,fCalibraMode(new AliTRDCalibraMode())
140 ,fDetectorPreviousTrack(-1)
144 ,fNumberClustersf(30)
150 ,fNumberBinCharge(100)
156 ,fGoodTracklet(kTRUE)
157 ,fLinearFitterTracklet(0x0)
159 ,fEntriesLinearFitter(0x0)
164 ,fLinearFitterArray(540)
165 ,fLinearVdriftFit(0x0)
170 // Default constructor
174 // Init some default values
177 fNumberUsedCh[0] = 0;
178 fNumberUsedCh[1] = 0;
179 fNumberUsedPh[0] = 0;
180 fNumberUsedPh[1] = 0;
182 fGeo = new AliTRDgeometry();
186 //______________________________________________________________________________________
187 AliTRDCalibraFillHisto::AliTRDCalibraFillHisto(const AliTRDCalibraFillHisto &c)
191 ,fMcmCorrectAngle(c.fMcmCorrectAngle)
194 ,fPRF2dOn(c.fPRF2dOn)
195 ,fHisto2d(c.fHisto2d)
196 ,fVector2d(c.fVector2d)
197 ,fLinearFitterOn(c.fLinearFitterOn)
198 ,fLinearFitterDebugOn(c.fLinearFitterDebugOn)
199 ,fRelativeScale(c.fRelativeScale)
200 ,fThresholdClusterPRF2(c.fThresholdClusterPRF2)
201 ,fLimitChargeIntegration(c.fLimitChargeIntegration)
202 ,fFillWithZero(c.fFillWithZero)
203 ,fNormalizeNbOfCluster(c.fNormalizeNbOfCluster)
204 ,fMaxCluster(c.fMaxCluster)
205 ,fNbMaxCluster(c.fNbMaxCluster)
208 ,fDebugLevel(c.fDebugLevel)
209 ,fDetectorPreviousTrack(c.fDetectorPreviousTrack)
210 ,fMCMPrevious(c.fMCMPrevious)
211 ,fROBPrevious(c.fROBPrevious)
212 ,fNumberClusters(c.fNumberClusters)
213 ,fNumberClustersf(c.fNumberClustersf)
214 ,fProcent(c.fProcent)
215 ,fDifference(c.fDifference)
216 ,fNumberTrack(c.fNumberTrack)
217 ,fTimeMax(c.fTimeMax)
219 ,fNumberBinCharge(c.fNumberBinCharge)
220 ,fNumberBinPRF(c.fNumberBinPRF)
221 ,fNgroupprf(c.fNgroupprf)
225 ,fGoodTracklet(c.fGoodTracklet)
226 ,fLinearFitterTracklet(0x0)
228 ,fEntriesLinearFitter(0x0)
233 ,fLinearFitterArray(540)
234 ,fLinearVdriftFit(0x0)
241 if(c.fCalibraMode) fCalibraMode = new AliTRDCalibraMode(*c.fCalibraMode);
242 if(c.fCalibraVector) fCalibraVector = new AliTRDCalibraVector(*c.fCalibraVector);
244 fPH2d = new TProfile2D(*c.fPH2d);
245 fPH2d->SetDirectory(0);
248 fPRF2d = new TProfile2D(*c.fPRF2d);
249 fPRF2d->SetDirectory(0);
252 fCH2d = new TH2I(*c.fCH2d);
253 fCH2d->SetDirectory(0);
255 if(c.fLinearVdriftFit){
256 fLinearVdriftFit = new AliTRDCalibraVdriftLinearFit(*c.fLinearVdriftFit);
259 if(c.fCalDetGain) fCalDetGain = new AliTRDCalDet(*c.fCalDetGain);
260 if(c.fCalROCGain) fCalROCGain = new AliTRDCalROC(*c.fCalROCGain);
265 fGeo = new AliTRDgeometry();
268 //____________________________________________________________________________________
269 AliTRDCalibraFillHisto::~AliTRDCalibraFillHisto()
272 // AliTRDCalibraFillHisto destructor
276 if ( fDebugStreamer ) delete fDebugStreamer;
278 if ( fCalDetGain ) delete fCalDetGain;
279 if ( fCalROCGain ) delete fCalROCGain;
281 if( fLinearFitterTracklet ) { delete fLinearFitterTracklet; }
285 delete [] fEntriesCH;
286 delete [] fEntriesLinearFitter;
289 for(Int_t idet=0; idet<AliTRDgeometry::kNdet; idet++){
290 TLinearFitter *f = (TLinearFitter*)fLinearFitterArray.At(idet);
298 //_____________________________________________________________________________
299 void AliTRDCalibraFillHisto::Destroy()
310 //_____________________________________________________________________________
311 void AliTRDCalibraFillHisto::DestroyDebugStreamer()
314 // Delete DebugStreamer
317 if ( fDebugStreamer ) delete fDebugStreamer;
318 fDebugStreamer = 0x0;
321 //_____________________________________________________________________________
322 void AliTRDCalibraFillHisto::ClearHistos()
342 //////////////////////////////////////////////////////////////////////////////////
343 // calibration with AliTRDtrackV1: Init, Update
344 //////////////////////////////////////////////////////////////////////////////////
345 //____________Functions for initialising the AliTRDCalibraFillHisto in the code_________
346 Bool_t AliTRDCalibraFillHisto::Init2Dhistos()
349 // Init the histograms and stuff to be filled
354 AliTRDcalibDB *cal = AliTRDcalibDB::Instance();
356 AliInfo("Could not get calibDB");
359 AliTRDCommonParam *parCom = AliTRDCommonParam::Instance();
361 AliInfo("Could not get CommonParam");
366 fTimeMax = cal->GetNumberOfTimeBins();
367 fSf = parCom->GetSamplingFrequency();
368 if(!fNormalizeNbOfCluster) fRelativeScale = 20.0;
369 else fRelativeScale = 1.18;
370 fNumberClustersf = fTimeMax;
371 fNumberClusters = (Int_t)(0.5*fTimeMax);
373 // Init linear fitter
374 if(!fLinearFitterTracklet) {
375 fLinearFitterTracklet = new TLinearFitter(2,"pol1");
376 fLinearFitterTracklet->StoreData(kTRUE);
379 //calib object from database used for reconstruction
381 fCalDetGain->~AliTRDCalDet();
382 new(fCalDetGain) AliTRDCalDet(*(cal->GetGainFactorDet()));
383 }else fCalDetGain = new AliTRDCalDet(*(cal->GetGainFactorDet()));
385 // Calcul Xbins Chambd0, Chamb2
386 Int_t ntotal0 = CalculateTotalNumberOfBins(0);
387 Int_t ntotal1 = CalculateTotalNumberOfBins(1);
388 Int_t ntotal2 = CalculateTotalNumberOfBins(2);
390 // If vector method On initialised all the stuff
392 fCalibraVector = new AliTRDCalibraVector();
393 fCalibraVector->SetNumberBinCharge(fNumberBinCharge);
394 fCalibraVector->SetTimeMax(fTimeMax);
395 if(fNgroupprf != 0) {
396 fCalibraVector->SetNumberBinPRF(2*fNgroupprf*fNumberBinPRF);
397 fCalibraVector->SetPRFRange((Float_t)(3.0*fNgroupprf));
400 fCalibraVector->SetNumberBinPRF(fNumberBinPRF);
401 fCalibraVector->SetPRFRange(1.5);
403 for(Int_t k = 0; k < 3; k++){
404 fCalibraVector->SetDetCha0(k,fCalibraMode->GetDetChamb0(k));
405 fCalibraVector->SetDetCha2(k,fCalibraMode->GetDetChamb2(k));
407 TString namech("Nz");
408 namech += fCalibraMode->GetNz(0);
410 namech += fCalibraMode->GetNrphi(0);
411 fCalibraVector->SetNameCH((const char* ) namech);
412 TString nameph("Nz");
413 nameph += fCalibraMode->GetNz(1);
415 nameph += fCalibraMode->GetNrphi(1);
416 fCalibraVector->SetNamePH((const char* ) nameph);
417 TString nameprf("Nz");
418 nameprf += fCalibraMode->GetNz(2);
420 nameprf += fCalibraMode->GetNrphi(2);
422 nameprf += fNgroupprf;
423 fCalibraVector->SetNamePRF((const char* ) nameprf);
426 // Create the 2D histos corresponding to the pad groupCalibration mode
429 AliInfo(Form("The pad calibration mode for the relative gain calibration: Nz %d, and Nrphi %d"
430 ,fCalibraMode->GetNz(0)
431 ,fCalibraMode->GetNrphi(0)));
433 // Create the 2D histo
438 fAmpTotal = new Float_t[TMath::Max(fCalibraMode->GetDetChamb2(0),fCalibraMode->GetDetChamb0(0))];
439 for (Int_t k = 0; k < TMath::Max(fCalibraMode->GetDetChamb2(0),fCalibraMode->GetDetChamb0(0)); k++) {
443 fEntriesCH = new Int_t[ntotal0];
444 for(Int_t k = 0; k < ntotal0; k++){
451 AliInfo(Form("The pad calibration mode for the drift velocity calibration: Nz %d, and Nrphi %d"
452 ,fCalibraMode->GetNz(1)
453 ,fCalibraMode->GetNrphi(1)));
455 // Create the 2D histo
460 fPHPlace = new Short_t[fTimeMax];
461 for (Int_t k = 0; k < fTimeMax; k++) {
464 fPHValue = new Float_t[fTimeMax];
465 for (Int_t k = 0; k < fTimeMax; k++) {
469 if (fLinearFitterOn) {
470 //fLinearFitterArray.Expand(540);
471 fLinearFitterArray.SetName("ArrayLinearFitters");
472 fEntriesLinearFitter = new Int_t[540];
473 for(Int_t k = 0; k < 540; k++){
474 fEntriesLinearFitter[k] = 0;
476 fLinearVdriftFit = new AliTRDCalibraVdriftLinearFit();
481 AliInfo(Form("The pad calibration mode for the PRF calibration: Nz %d, and Nrphi %d"
482 ,fCalibraMode->GetNz(2)
483 ,fCalibraMode->GetNrphi(2)));
484 // Create the 2D histo
486 CreatePRF2d(ntotal2);
493 //____________Offline tracking in the AliTRDtracker____________________________
494 Bool_t AliTRDCalibraFillHisto::UpdateHistograms(AliTRDtrack *t)
497 // Use AliTRDtrack for the calibration
501 AliTRDcluster *cl = 0x0; // pointeur to cluster
502 Int_t index0 = 0; // index of the first cluster in the current chamber
503 Int_t index1 = 0; // index of the current cluster in the current chamber
505 //////////////////////////////
506 // loop over the clusters
507 ///////////////////////////////
508 while((cl = t->GetCluster(index1))){
510 /////////////////////////////////////////////////////////////////////////
511 // Fill the infos for the previous clusters if not the same detector
512 ////////////////////////////////////////////////////////////////////////
513 Int_t detector = cl->GetDetector();
514 if ((detector != fDetectorPreviousTrack) &&
515 (index0 != index1)) {
519 //If the same track, then look if the previous detector is in
520 //the same plane, if yes: not a good track
521 if ((GetLayer(detector) == GetLayer(fDetectorPreviousTrack))) {
525 // Fill only if the track doesn't touch a masked pad or doesn't
528 // drift velocity unables to cut bad tracklets
529 Bool_t pass = FindP1TrackPHtracklet(t,index0,index1);
533 FillTheInfoOfTheTrackCH(index1-index0);
538 FillTheInfoOfTheTrackPH();
541 if(pass && fPRF2dOn) HandlePRFtracklet(t,index0,index1);
544 } // if a good tracklet
547 ResetfVariablestracklet();
550 } // Fill at the end the charge
553 /////////////////////////////////////////////////////////////
554 // Localise and take the calib gain object for the detector
555 ////////////////////////////////////////////////////////////
556 if (detector != fDetectorPreviousTrack) {
558 //Localise the detector
559 LocalisationDetectorXbins(detector);
562 AliTRDcalibDB *cal = AliTRDcalibDB::Instance();
564 AliInfo("Could not get calibDB");
571 fCalROCGain->~AliTRDCalROC();
572 new(fCalROCGain) AliTRDCalROC(*(cal->GetGainFactorROC(detector)));
574 }else fCalROCGain = new AliTRDCalROC(*(cal->GetGainFactorROC(detector)));
578 // Reset the detectbjobsor
579 fDetectorPreviousTrack = detector;
581 ///////////////////////////////////////
582 // Store the info of the cluster
583 ///////////////////////////////////////
584 Int_t row = cl->GetPadRow();
585 Int_t col = cl->GetPadCol();
586 CheckGoodTrackletV1(cl);
587 Int_t group[2] = {0,0};
588 if(fCH2dOn) group[0] = CalculateCalibrationGroup(0,row,col);
589 if(fPH2dOn) group[1] = CalculateCalibrationGroup(1,row,col);
590 StoreInfoCHPHtrack(cl,t->GetClusterdQdl(index1),group,row,col);
594 } // while on clusters
596 ///////////////////////////
597 // Fill the last plane
598 //////////////////////////
599 if( index0 != index1 ){
605 // drift velocity unables to cut bad tracklets
606 Bool_t pass = FindP1TrackPHtracklet(t,index0,index1);
610 FillTheInfoOfTheTrackCH(index1-index0);
615 FillTheInfoOfTheTrackPH();
618 if(pass && fPRF2dOn) HandlePRFtracklet(t,index0,index1);
620 } // if a good tracklet
625 ResetfVariablestracklet();
630 //____________Offline tracking in the AliTRDtracker____________________________
631 Bool_t AliTRDCalibraFillHisto::UpdateHistogramsV1(AliTRDtrackV1 *t)
634 // Use AliTRDtrackV1 for the calibration
638 const AliTRDseedV1 *tracklet = 0x0; // tracklet per plane
639 AliTRDcluster *cl = 0x0; // cluster attached now to the tracklet
640 Bool_t newtr = kTRUE; // new track
643 AliTRDcalibDB *cal = AliTRDcalibDB::Instance();
645 AliInfo("Could not get calibDB");
649 ///////////////////////////
650 // loop over the tracklet
651 ///////////////////////////
652 for(Int_t itr = 0; itr < 6; itr++){
654 if(!(tracklet = t->GetTracklet(itr))) continue;
655 if(!tracklet->IsOK()) continue;
657 ResetfVariablestracklet();
659 //////////////////////////////////////////
660 // localisation of the tracklet and dqdl
661 //////////////////////////////////////////
662 Int_t layer = tracklet->GetPlane();
664 while(!(cl = tracklet->GetClusters(ic++))) continue;
665 Int_t detector = cl->GetDetector();
666 if (detector != fDetectorPreviousTrack) {
667 // if not a new track
669 // don't use the rest of this track if in the same plane
670 if (layer == GetLayer(fDetectorPreviousTrack)) {
671 //printf("bad tracklet, same layer for detector %d\n",detector);
675 //Localise the detector bin
676 LocalisationDetectorXbins(detector);
680 fCalROCGain->~AliTRDCalROC();
681 new(fCalROCGain) AliTRDCalROC(*(cal->GetGainFactorROC(detector)));
683 }else fCalROCGain = new AliTRDCalROC(*(cal->GetGainFactorROC(detector)));
686 fDetectorPreviousTrack = detector;
690 ////////////////////////////
691 // loop over the clusters
692 ////////////////////////////
693 Int_t nbclusters = 0;
694 for(int jc=0; jc<AliTRDseed::knTimebins; jc++){
695 if(!(cl = tracklet->GetClusters(jc))) continue;
698 // Store the info bis of the tracklet
699 Int_t row = cl->GetPadRow();
700 Int_t col = cl->GetPadCol();
701 CheckGoodTrackletV1(cl);
702 Int_t group[2] = {0,0};
703 if(fCH2dOn) group[0] = CalculateCalibrationGroup(0,row,col);
704 if(fPH2dOn) group[1] = CalculateCalibrationGroup(1,row,col);
705 StoreInfoCHPHtrack(cl, tracklet->GetdQdl(jc),group,row,col);
708 ////////////////////////////////////////
709 // Fill the stuffs if a good tracklet
710 ////////////////////////////////////////
713 // drift velocity unables to cut bad tracklets
714 Bool_t pass = FindP1TrackPHtrackletV1(tracklet, nbclusters);
718 FillTheInfoOfTheTrackCH(nbclusters);
723 FillTheInfoOfTheTrackPH();
726 if(pass && fPRF2dOn) HandlePRFtrackletV1(tracklet,nbclusters);
728 } // if a good tracklet
734 ///////////////////////////////////////////////////////////////////////////////////
735 // Routine inside the update with AliTRDtrack
736 ///////////////////////////////////////////////////////////////////////////////////
737 //____________Offine tracking in the AliTRDtracker_____________________________
738 Bool_t AliTRDCalibraFillHisto::FindP1TrackPHtracklet(AliTRDtrack *t, Int_t index0, Int_t index1)
741 // Drift velocity calibration:
742 // Fit the clusters with a straight line
743 // From the slope find the drift velocity
746 //Number of points: if less than 3 return kFALSE
747 Int_t npoints = index1-index0;
748 if(npoints <= 2) return kFALSE;
753 Int_t detector = ((AliTRDcluster *) t->GetCluster(index0))->GetDetector(); //detector
754 // parameters of the track
755 Double_t snp = t->GetSnpPlane(GetLayer(detector)); // sin angle in the plan yx track
756 Double_t tgl = t->GetTglPlane(GetLayer(detector)); // dz/dl and not dz/dx!
757 Double_t tnp = 0.0; // tan angle in the plan xy track
758 if( TMath::Abs(snp) < 1.){
759 tnp = snp / TMath::Sqrt((1.-snp)*(1.+snp));
761 Float_t dzdx = tgl*TMath::Sqrt(1+tnp*tnp); // dz/dx now from dz/dl
762 // tilting pad and cross row
763 Int_t crossrow = 0; // if it crosses a pad row
764 Int_t rowp = -1; // if it crosses a pad row
765 AliTRDpadPlane *padplane = fGeo->GetPadPlane(GetLayer(detector),GetStack(detector));
766 Double_t tiltingangle = padplane->GetTiltingAngle(); // tiltingangle of the pad
767 Float_t tnt = TMath::Tan(tiltingangle/180.*TMath::Pi()); // tan tiltingangle
769 fLinearFitterTracklet->ClearPoints();
770 Double_t dydt = 0.0; // dydt tracklet after straight line fit
771 Double_t errorpar = 0.0; // error after straight line fit on dy/dt
772 Double_t pointError = 0.0; // error after straight line fit
773 Int_t nbli = 0; // number linear fitter points
775 //////////////////////////////
776 // loop over clusters
777 ////////////////////////////
778 for(Int_t k = 0; k < npoints; k++){
780 AliTRDcluster *cl = (AliTRDcluster *) t->GetCluster(k+index0);
781 if((fLimitChargeIntegration) && (!cl->IsInChamber())) continue;
782 Double_t ycluster = cl->GetY();
783 Int_t time = cl->GetPadTime();
784 Double_t timeis = time/fSf;
785 //Double_t q = cl->GetQ();
786 //See if cross two pad rows
787 Int_t row = cl->GetPadRow();
789 if(row != rowp) crossrow = 1;
791 fLinearFitterTracklet->AddPoint(&timeis,ycluster,1);
796 //////////////////////////////
798 //////////////////////////////
800 fLinearFitterTracklet->ClearPoints();
804 fLinearFitterTracklet->Eval();
805 fLinearFitterTracklet->GetParameters(pars);
806 pointError = TMath::Sqrt(fLinearFitterTracklet->GetChisquare()/(nbli-2));
807 errorpar = fLinearFitterTracklet->GetParError(1)*pointError;
809 fLinearFitterTracklet->ClearPoints();
811 /////////////////////////////
813 ////////////////////////////
815 if ( !fDebugStreamer ) {
817 TDirectory *backup = gDirectory;
818 fDebugStreamer = new TTreeSRedirector("TRDdebugCalibraFill.root");
819 if ( backup ) backup->cd(); //we don't want to be cd'd to the debug streamer
823 (* fDebugStreamer) << "FindP1TrackPHtracklet0"<<
824 //"snpright="<<snpright<<
825 "npoints="<<npoints<<
827 "detector="<<detector<<
834 "crossrow="<<crossrow<<
835 "errorpar="<<errorpar<<
836 "pointError="<<pointError<<
840 Int_t nbclusters = index1-index0;
841 Int_t layer = GetLayer(fDetectorPreviousTrack);
843 (* fDebugStreamer) << "FindP1TrackPHtracklet1"<<
844 //"snpright="<<snpright<<
845 "nbclusters="<<nbclusters<<
846 "detector="<<fDetectorPreviousTrack<<
852 ///////////////////////////
854 ///////////////////////////
855 if(npoints < fNumberClusters) return kFALSE;
856 if(npoints > fNumberClustersf) return kFALSE;
857 if(pointError >= 0.1) return kFALSE;
858 if(crossrow == 1) return kFALSE;
860 ////////////////////////////
862 ////////////////////////////
864 //Add to the linear fitter of the detector
865 if( TMath::Abs(snp) < 1.){
866 Double_t x = tnp-dzdx*tnt;
867 (GetLinearFitter(detector,kTRUE))->AddPoint(&x,dydt);
868 if(fLinearFitterDebugOn) {
869 fLinearVdriftFit->Update(detector,x,pars[1]);
871 fEntriesLinearFitter[detector]++;
877 //____________Offine tracking in the AliTRDtracker_____________________________
878 Bool_t AliTRDCalibraFillHisto::FindP1TrackPHtrackletV1(const AliTRDseedV1 *tracklet, Int_t nbclusters)
881 // Drift velocity calibration:
882 // Fit the clusters with a straight line
883 // From the slope find the drift velocity
886 ////////////////////////////////////////////////
887 //Number of points: if less than 3 return kFALSE
888 /////////////////////////////////////////////////
889 if(nbclusters <= 2) return kFALSE;
894 // results of the linear fit
895 Double_t dydt = 0.0; // dydt tracklet after straight line fit
896 Double_t errorpar = 0.0; // error after straight line fit on dy/dt
897 Double_t pointError = 0.0; // error after straight line fit
898 // pad row problemes: avoid tracklet that cross pad rows, tilting angle in the constant
899 Int_t crossrow = 0; // if it crosses a pad row
900 Int_t rowp = -1; // if it crosses a pad row
901 Float_t tnt = tracklet->GetTilt(); // tan tiltingangle
902 fLinearFitterTracklet->ClearPoints();
905 ///////////////////////////////////////////
906 // Take the parameters of the track
907 //////////////////////////////////////////
908 // take now the snp, tnp and tgl from the track
909 Double_t snp = tracklet->GetSnp(); // sin dy/dx at the end of the chamber
910 Double_t tnp = 0.0; // dy/dx at the end of the chamber
911 if( TMath::Abs(snp) < 1.){
912 tnp = snp / TMath::Sqrt((1.-snp)*(1.+snp));
914 Double_t tgl = tracklet->GetTgl(); // dz/dl
915 Double_t dzdx = tgl*TMath::Sqrt(1+tnp*tnp); // dz/dx calculated from dz/dl
917 //Double_t tnp = tracklet->GetYref(1); // dy/dx at the entrance of the chamber
918 //Double_t tgl = tracklet->GetZref(1); // dz/dl at the entrance of the chamber
919 //Double_t dzdx = tgl; //*TMath::Sqrt(1+tnp*tnp); // dz/dx from dz/dl
920 // at the end with correction due to linear fit
921 //Double_t tnp = tracklet->GetYfit(1); // dy/dx at the end of the chamber after fit correction
922 //Double_t tgl = tracklet->GetZfit(1); // dz/dl at the end of the chamber after fit correction
925 ////////////////////////////
926 // loop over the clusters
927 ////////////////////////////
929 AliTRDcluster *cl = 0x0;
930 for(int ic=0; ic<AliTRDseed::knTimebins; ic++){
931 if(!(cl = tracklet->GetClusters(ic))) continue;
932 if((fLimitChargeIntegration) && (!cl->IsInChamber())) continue;
934 Double_t ycluster = cl->GetY();
935 Int_t time = cl->GetPadTime();
936 Double_t timeis = time/fSf;
937 //See if cross two pad rows
938 Int_t row = cl->GetPadRow();
939 if(rowp==-1) rowp = row;
940 if(row != rowp) crossrow = 1;
942 fLinearFitterTracklet->AddPoint(&timeis,ycluster,1);
947 ////////////////////////////////////
948 // Do the straight line fit now
949 ///////////////////////////////////
951 fLinearFitterTracklet->ClearPoints();
955 fLinearFitterTracklet->Eval();
956 fLinearFitterTracklet->GetParameters(pars);
957 pointError = TMath::Sqrt(fLinearFitterTracklet->GetChisquare()/(nbli-2));
958 errorpar = fLinearFitterTracklet->GetParError(1)*pointError;
960 //printf("chis %f, nbli %d, pointError %f, parError %f, errorpar %f\n",fLinearFitterTracklet->GetChisquare(),nbli,pointError,fLinearFitterTracklet->GetParError(1),errorpar);
961 fLinearFitterTracklet->ClearPoints();
963 ////////////////////////////////
965 ///////////////////////////////
969 if ( !fDebugStreamer ) {
971 TDirectory *backup = gDirectory;
972 fDebugStreamer = new TTreeSRedirector("TRDdebugCalibraFill.root");
973 if ( backup ) backup->cd(); //we don't want to be cd'd to the debug streamer
977 Int_t layer = GetLayer(fDetectorPreviousTrack);
979 (* fDebugStreamer) << "FindP1TrackPHtrackletV1"<<
980 //"snpright="<<snpright<<
982 "nbclusters="<<nbclusters<<
983 "detector="<<fDetectorPreviousTrack<<
991 "crossrow="<<crossrow<<
992 "errorpar="<<errorpar<<
993 "pointError="<<pointError<<
998 /////////////////////////
1000 ////////////////////////
1002 if(nbclusters < fNumberClusters) return kFALSE;
1003 if(nbclusters > fNumberClustersf) return kFALSE;
1004 if(pointError >= 0.3) return kFALSE;
1005 if(crossrow == 1) return kFALSE;
1007 ///////////////////////
1009 //////////////////////
1011 if(fLinearFitterOn){
1012 //Add to the linear fitter of the detector
1013 if( TMath::Abs(snp) < 1.){
1014 Double_t x = tnp-dzdx*tnt;
1015 (GetLinearFitter(fDetectorPreviousTrack,kTRUE))->AddPoint(&x,dydt);
1016 if(fLinearFitterDebugOn) {
1017 fLinearVdriftFit->Update(fDetectorPreviousTrack,x,pars[1]);
1019 fEntriesLinearFitter[fDetectorPreviousTrack]++;
1025 //____________Offine tracking in the AliTRDtracker_____________________________
1026 Bool_t AliTRDCalibraFillHisto::HandlePRFtracklet(AliTRDtrack *t, Int_t index0, Int_t index1)
1029 // PRF width calibration
1030 // Assume a Gaussian shape: determinate the position of the three pad clusters
1031 // Fit with a straight line
1032 // Take the fitted values for all the clusters (3 or 2 pad clusters)
1033 // Fill the PRF as function of angle of the track
1038 //////////////////////////
1040 /////////////////////////
1041 Int_t npoints = index1-index0; // number of total points
1042 Int_t nb3pc = 0; // number of three pads clusters used for fit
1043 Int_t detector = ((AliTRDcluster *) t->GetCluster(index0))->GetDetector(); // detector
1044 // To see the difference due to the fit
1045 Double_t *padPositions;
1046 padPositions = new Double_t[npoints];
1047 for(Int_t k = 0; k < npoints; k++){
1048 padPositions[k] = 0.0;
1050 // Take the tgl and snp with the track t now
1051 Double_t tgl = t->GetTglPlane(GetLayer(detector)); //dz/dl and not dz/dx
1052 Double_t snp = t->GetSnpPlane(GetLayer(detector)); // sin angle in xy plan
1053 Float_t dzdx = 0.0; // dzdx
1055 if(TMath::Abs(snp) < 1.0){
1056 tnp = snp / TMath::Sqrt((1.-snp)*(1.+snp));
1057 dzdx = tgl*TMath::Sqrt(1+tnp*tnp);
1060 fLinearFitterTracklet->ClearPoints();
1062 ///////////////////////////
1063 // calcul the tnp group
1064 ///////////////////////////
1065 Bool_t echec = kFALSE;
1066 Double_t shift = 0.0;
1067 //Calculate the shift in x coresponding to this tnp
1068 if(fNgroupprf != 0.0){
1069 shift = -3.0*(fNgroupprf-1)-1.5;
1070 Double_t limithigh = -0.2*(fNgroupprf-1);
1071 if((tnp < (-0.2*fNgroupprf)) || (tnp > (0.2*fNgroupprf))) echec = kTRUE;
1073 while(tnp > limithigh){
1080 delete [] padPositions;
1084 //////////////////////
1086 /////////////////////
1087 for(Int_t k = 0; k < npoints; k++){
1089 AliTRDcluster *cl = (AliTRDcluster *) t->GetCluster(k+index0);
1090 Short_t *signals = cl->GetSignals();
1091 Double_t time = cl->GetLocalTimeBin();
1092 //Calculate x if possible
1093 Float_t xcenter = 0.0;
1094 Bool_t echec1 = kTRUE;
1095 if((time<=7) || (time>=21)) continue;
1096 // Center 3 balanced: position with the center of the pad
1097 if ((((Float_t) signals[3]) > 0.0) &&
1098 (((Float_t) signals[2]) > 0.0) &&
1099 (((Float_t) signals[4]) > 0.0)) {
1101 // Security if the denomiateur is 0
1102 if ((((Float_t) (((Float_t) signals[3]) * ((Float_t) signals[3]))) /
1103 ((Float_t) (((Float_t) signals[2]) * ((Float_t) signals[4])))) != 1.0) {
1104 xcenter = 0.5 * (TMath::Log((Float_t) (((Float_t) signals[4]) / ((Float_t) signals[2]))))
1105 / (TMath::Log(((Float_t) (((Float_t) signals[3]) * ((Float_t) signals[3])))
1106 / ((Float_t) (((Float_t) signals[2]) * ((Float_t) signals[4])))));
1112 if(TMath::Abs(xcenter) > 0.5) echec = kTRUE;
1114 //if no echec: calculate with the position of the pad
1115 // Position of the cluster
1116 Double_t padPosition = xcenter + cl->GetPadCol();
1117 padPositions[k] = padPosition;
1119 fLinearFitterTracklet->AddPoint(&time, padPosition,1);
1123 /////////////////////////////
1125 ////////////////////////////
1127 delete [] padPositions;
1128 fLinearFitterTracklet->ClearPoints();
1131 fLinearFitterTracklet->Eval();
1133 fLinearFitterTracklet->GetParameters(line);
1134 Float_t pointError = -1.0;
1135 if( fLinearFitterTracklet->GetChisquare()>=0.0) {
1136 pointError = TMath::Sqrt( fLinearFitterTracklet->GetChisquare()/(nb3pc-2));
1138 fLinearFitterTracklet->ClearPoints();
1140 /////////////////////////////////////////////////////
1141 // Now fill the PRF: second loop over clusters
1142 /////////////////////////////////////////////////////
1143 for(Int_t k = 0; k < npoints; k++){
1145 AliTRDcluster *cl = (AliTRDcluster *) t->GetCluster(k+index0);
1146 Short_t *signals = cl->GetSignals(); // signal
1147 Double_t time = cl->GetLocalTimeBin(); // time bin
1148 Float_t padPosTracklet = line[0]+line[1]*time; // reconstruct position from fit
1149 Float_t padPos = cl->GetPadCol(); // middle pad
1150 Double_t dpad = padPosTracklet - padPos; // reconstruct position relative to middle pad from fit
1151 Float_t ycenter = 0.0; // relative center charge
1152 Float_t ymin = 0.0; // relative left charge
1153 Float_t ymax = 0.0; // relative right charge
1155 //Requiere simply two pads clusters at least
1156 if(((((Float_t) signals[3]) > 0.0) && (((Float_t) signals[2]) > 0.0)) ||
1157 ((((Float_t) signals[3]) > 0.0) && (((Float_t) signals[4]) > 0.0))){
1158 Float_t sum = ((Float_t) signals[2]) + ((Float_t) signals[3]) + ((Float_t) signals[4]);
1159 if(sum > 0.0) ycenter = ((Float_t) signals[3])/ sum;
1160 if(sum > 0.0) ymin = ((Float_t) signals[2])/ sum;
1161 if(sum > 0.0) ymax = ((Float_t) signals[4])/ sum;
1165 Int_t rowcl = cl->GetPadRow(); // row of cluster
1166 Int_t colcl = cl->GetPadCol(); // col of cluster
1167 Int_t grouplocal = CalculateCalibrationGroup(2,rowcl,colcl); // calcul the corresponding group
1168 Int_t caligroup = fCalibraMode->GetXbins(2)+ grouplocal; // calcul the corresponding group
1169 Float_t xcl = cl->GetY(); // y cluster
1170 Float_t qcl = cl->GetQ(); // charge cluster
1171 Int_t layer = GetLayer(detector); // layer
1172 Int_t stack = GetStack(detector); // stack
1173 Double_t xdiff = dpad; // reconstructed position constant
1174 Double_t x = dpad; // reconstructed position moved
1175 Float_t ep = pointError; // error of fit
1176 Float_t signal1 = (Float_t)signals[1]; // signal at the border
1177 Float_t signal3 = (Float_t)signals[3]; // signal
1178 Float_t signal2 = (Float_t)signals[2]; // signal
1179 Float_t signal4 = (Float_t)signals[4]; // signal
1180 Float_t signal5 = (Float_t)signals[5]; // signal at the border
1182 //////////////////////////////
1184 /////////////////////////////
1185 if(fDebugLevel > 0){
1186 if ( !fDebugStreamer ) {
1188 TDirectory *backup = gDirectory;
1189 fDebugStreamer = new TTreeSRedirector("TRDdebugCalibraFill.root");
1190 if ( backup ) backup->cd(); //we don't want to be cd'd to the debug streamer
1196 Float_t y = ycenter;
1197 (* fDebugStreamer) << "HandlePRFtracklet"<<
1198 "caligroup="<<caligroup<<
1199 "detector="<<detector<<
1202 "npoints="<<npoints<<
1211 "padPosition="<<padPositions[k]<<
1212 "padPosTracklet="<<padPosTracklet<<
1217 "signal1="<<signal1<<
1218 "signal2="<<signal2<<
1219 "signal3="<<signal3<<
1220 "signal4="<<signal4<<
1221 "signal5="<<signal5<<
1227 (* fDebugStreamer) << "HandlePRFtracklet"<<
1228 "caligroup="<<caligroup<<
1229 "detector="<<detector<<
1232 "npoints="<<npoints<<
1241 "padPosition="<<padPositions[k]<<
1242 "padPosTracklet="<<padPosTracklet<<
1247 "signal1="<<signal1<<
1248 "signal2="<<signal2<<
1249 "signal3="<<signal3<<
1250 "signal4="<<signal4<<
1251 "signal5="<<signal5<<
1257 (* fDebugStreamer) << "HandlePRFtracklet"<<
1258 "caligroup="<<caligroup<<
1259 "detector="<<detector<<
1262 "npoints="<<npoints<<
1271 "padPosition="<<padPositions[k]<<
1272 "padPosTracklet="<<padPosTracklet<<
1277 "signal1="<<signal1<<
1278 "signal2="<<signal2<<
1279 "signal3="<<signal3<<
1280 "signal4="<<signal4<<
1281 "signal5="<<signal5<<
1287 ////////////////////////////
1289 ///////////////////////////
1290 if(npoints < fNumberClusters) continue;
1291 if(npoints > fNumberClustersf) continue;
1292 if(nb3pc <= 5) continue;
1293 if((time >= 21) || (time < 7)) continue;
1294 if(TMath::Abs(snp) >= 1.0) continue;
1295 if(TMath::Abs(qcl) < 80) continue;
1297 ////////////////////////////
1299 ///////////////////////////
1301 if(TMath::Abs(dpad) < 1.5) {
1302 fPRF2d->Fill(shift+dpad,(caligroup+0.5),ycenter);
1303 fPRF2d->Fill(shift-dpad,(caligroup+0.5),ycenter);
1305 if((ymin > 0.0) && (TMath::Abs(dpad+1.0) < 1.5)) {
1306 fPRF2d->Fill(shift-(dpad+1.0),(caligroup+0.5),ymin);
1307 fPRF2d->Fill(shift+(dpad+1.0),(caligroup+0.5),ymin);
1309 if((ymax > 0.0) && (TMath::Abs(dpad-1.0) < 1.5)) {
1310 fPRF2d->Fill(shift+1.0-dpad,(caligroup+0.5),ymax);
1311 fPRF2d->Fill(shift-1.0+dpad,(caligroup+0.5),ymax);
1315 if(TMath::Abs(dpad) < 1.5) {
1316 fCalibraVector->UpdateVectorPRF(fDetectorPreviousTrack,grouplocal,shift+dpad,ycenter);
1317 fCalibraVector->UpdateVectorPRF(fDetectorPreviousTrack,grouplocal,shift-dpad,ycenter);
1319 if((ymin > 0.0) && (TMath::Abs(dpad+1.0) < 1.5)) {
1320 fCalibraVector->UpdateVectorPRF(fDetectorPreviousTrack,grouplocal,shift-(dpad+1.0),ymin);
1321 fCalibraVector->UpdateVectorPRF(fDetectorPreviousTrack,grouplocal,shift+(dpad+1.0),ymin);
1323 if((ymax > 0.0) && (TMath::Abs(dpad-1.0) < 1.5)) {
1324 fCalibraVector->UpdateVectorPRF(fDetectorPreviousTrack,grouplocal,shift+1.0-dpad,ymax);
1325 fCalibraVector->UpdateVectorPRF(fDetectorPreviousTrack,grouplocal,shift-1.0+dpad,ymax);
1329 delete [] padPositions;
1333 //____________Offine tracking in the AliTRDtracker_____________________________
1334 Bool_t AliTRDCalibraFillHisto::HandlePRFtrackletV1(const AliTRDseedV1 *tracklet, Int_t nbclusters)
1337 // PRF width calibration
1338 // Assume a Gaussian shape: determinate the position of the three pad clusters
1339 // Fit with a straight line
1340 // Take the fitted values for all the clusters (3 or 2 pad clusters)
1341 // Fill the PRF as function of angle of the track
1345 //printf("begin\n");
1346 ///////////////////////////////////////////
1347 // Take the parameters of the track
1348 //////////////////////////////////////////
1349 // take now the snp, tnp and tgl from the track
1350 Double_t snp = tracklet->GetSnp(); // sin dy/dx at the end of the chamber
1351 Double_t tnp = 0.0; // dy/dx at the end of the chamber
1352 if( TMath::Abs(snp) < 1.){
1353 tnp = snp / TMath::Sqrt((1.-snp)*(1.+snp));
1355 Double_t tgl = tracklet->GetTgl(); // dz/dl
1356 Double_t dzdx = tgl*TMath::Sqrt(1+tnp*tnp); // dz/dx calculated from dz/dl
1358 //Double_t tnp = tracklet->GetYref(1); // dy/dx at the entrance of the chamber
1359 //Double_t tgl = tracklet->GetZref(1); // dz/dl at the entrance of the chamber
1360 //Double_t dzdx = tgl; //*TMath::Sqrt(1+tnp*tnp); // dz/dx from dz/dl
1361 // at the end with correction due to linear fit
1362 //Double_t tnp = tracklet->GetYfit(1); // dy/dx at the end of the chamber after fit correction
1363 //Double_t tgl = tracklet->GetZfit(1); // dz/dl at the end of the chamber after fit correction
1365 ///////////////////////////////
1366 // Calculate tnp group shift
1367 ///////////////////////////////
1368 Bool_t echec = kFALSE;
1369 Double_t shift = 0.0;
1370 //Calculate the shift in x coresponding to this tnp
1371 if(fNgroupprf != 0.0){
1372 shift = -3.0*(fNgroupprf-1)-1.5;
1373 Double_t limithigh = -0.2*(fNgroupprf-1);
1374 if((tnp < (-0.2*fNgroupprf)) || (tnp > (0.2*fNgroupprf))) echec = kTRUE;
1376 while(tnp > limithigh){
1382 // do nothing if out of tnp range
1383 //printf("echec %d\n",(Int_t)echec);
1384 if(echec) return kFALSE;
1386 ///////////////////////
1388 //////////////////////
1390 Int_t nb3pc = 0; // number of three pads clusters used for fit
1391 Double_t *padPositions; // to see the difference between the fit and the 3 pad clusters position
1392 padPositions = new Double_t[AliTRDseed::knTimebins];
1393 for(Int_t k = 0; k < AliTRDseed::knTimebins; k++){
1394 padPositions[k] = 0.0;
1396 fLinearFitterTracklet->ClearPoints();
1398 //printf("loop clusters \n");
1399 ////////////////////////////
1400 // loop over the clusters
1401 ////////////////////////////
1402 AliTRDcluster *cl = 0x0;
1403 for(int ic=0; ic<AliTRDseed::knTimebins; ic++){
1404 if(!(cl = tracklet->GetClusters(ic))) continue;
1406 Double_t time = cl->GetLocalTimeBin();
1407 if((time<=7) || (time>=21)) continue;
1408 Short_t *signals = cl->GetSignals();
1409 Float_t xcenter = 0.0;
1410 Bool_t echec1 = kTRUE;
1412 /////////////////////////////////////////////////////////////
1413 // Center 3 balanced: position with the center of the pad
1414 /////////////////////////////////////////////////////////////
1415 if ((((Float_t) signals[3]) > 0.0) &&
1416 (((Float_t) signals[2]) > 0.0) &&
1417 (((Float_t) signals[4]) > 0.0)) {
1419 // Security if the denomiateur is 0
1420 if ((((Float_t) (((Float_t) signals[3]) * ((Float_t) signals[3]))) /
1421 ((Float_t) (((Float_t) signals[2]) * ((Float_t) signals[4])))) != 1.0) {
1422 xcenter = 0.5 * (TMath::Log((Float_t) (((Float_t) signals[4]) / ((Float_t) signals[2]))))
1423 / (TMath::Log(((Float_t) (((Float_t) signals[3]) * ((Float_t) signals[3])))
1424 / ((Float_t) (((Float_t) signals[2]) * ((Float_t) signals[4])))));
1430 if(TMath::Abs(xcenter) > 0.5) echec1 = kTRUE;
1431 if(echec1) continue;
1433 ////////////////////////////////////////////////////////
1434 //if no echec1: calculate with the position of the pad
1435 // Position of the cluster
1436 // fill the linear fitter
1437 ///////////////////////////////////////////////////////
1438 Double_t padPosition = xcenter + cl->GetPadCol();
1439 padPositions[ic] = padPosition;
1441 fLinearFitterTracklet->AddPoint(&time, padPosition,1);
1446 //printf("Fin loop clusters \n");
1447 //////////////////////////////
1448 // fit with a straight line
1449 /////////////////////////////
1451 delete [] padPositions;
1452 fLinearFitterTracklet->ClearPoints();
1453 delete [] padPositions;
1456 fLinearFitterTracklet->Eval();
1458 fLinearFitterTracklet->GetParameters(line);
1459 Float_t pointError = -1.0;
1460 if( fLinearFitterTracklet->GetChisquare()>=0.0) {
1461 pointError = TMath::Sqrt( fLinearFitterTracklet->GetChisquare()/(nb3pc-2));
1463 fLinearFitterTracklet->ClearPoints();
1465 //printf("PRF second loop \n");
1466 ////////////////////////////////////////////////
1467 // Fill the PRF: Second loop over clusters
1468 //////////////////////////////////////////////
1469 for(int ic=0; ic<AliTRDseed::knTimebins; ic++){
1470 if(!(cl = tracklet->GetClusters(ic))) continue;
1472 Short_t *signals = cl->GetSignals(); // signal
1473 Double_t time = cl->GetLocalTimeBin(); // time bin
1474 Float_t padPosTracklet = line[0]+line[1]*time; // reconstruct position from fit
1475 Float_t padPos = cl->GetPadCol(); // middle pad
1476 Double_t dpad = padPosTracklet - padPos; // reconstruct position relative to middle pad from fit
1477 Float_t ycenter = 0.0; // relative center charge
1478 Float_t ymin = 0.0; // relative left charge
1479 Float_t ymax = 0.0; // relative right charge
1481 ////////////////////////////////////////////////////////////////
1482 // Calculate ycenter, ymin and ymax even for two pad clusters
1483 ////////////////////////////////////////////////////////////////
1484 if(((((Float_t) signals[3]) > 0.0) && (((Float_t) signals[2]) > 0.0)) ||
1485 ((((Float_t) signals[3]) > 0.0) && (((Float_t) signals[4]) > 0.0))){
1486 Float_t sum = ((Float_t) signals[2]) + ((Float_t) signals[3]) + ((Float_t) signals[4]);
1487 if(sum > 0.0) ycenter = ((Float_t) signals[3])/ sum;
1488 if(sum > 0.0) ymin = ((Float_t) signals[2])/ sum;
1489 if(sum > 0.0) ymax = ((Float_t) signals[4])/ sum;
1492 /////////////////////////
1493 // Calibration group
1494 ////////////////////////
1495 Int_t rowcl = cl->GetPadRow(); // row of cluster
1496 Int_t colcl = cl->GetPadCol(); // col of cluster
1497 Int_t grouplocal = CalculateCalibrationGroup(2,rowcl,colcl); // calcul the corresponding group
1498 Int_t caligroup = fCalibraMode->GetXbins(2)+ grouplocal; // calcul the corresponding group
1499 Float_t xcl = cl->GetY(); // y cluster
1500 Float_t qcl = cl->GetQ(); // charge cluster
1501 Int_t layer = GetLayer(fDetectorPreviousTrack); // layer
1502 Int_t stack = GetStack(fDetectorPreviousTrack); // stack
1503 Double_t xdiff = dpad; // reconstructed position constant
1504 Double_t x = dpad; // reconstructed position moved
1505 Float_t ep = pointError; // error of fit
1506 Float_t signal1 = (Float_t)signals[1]; // signal at the border
1507 Float_t signal3 = (Float_t)signals[3]; // signal
1508 Float_t signal2 = (Float_t)signals[2]; // signal
1509 Float_t signal4 = (Float_t)signals[4]; // signal
1510 Float_t signal5 = (Float_t)signals[5]; // signal at the border
1514 /////////////////////
1516 ////////////////////
1518 if(fDebugLevel > 0){
1519 if ( !fDebugStreamer ) {
1521 TDirectory *backup = gDirectory;
1522 fDebugStreamer = new TTreeSRedirector("TRDdebugCalibraFill.root");
1523 if ( backup ) backup->cd(); //we don't want to be cd'd to the debug streamer
1528 Float_t y = ycenter;
1529 (* fDebugStreamer) << "HandlePRFtrackletV1"<<
1530 "caligroup="<<caligroup<<
1531 "detector="<<fDetectorPreviousTrack<<
1534 "npoints="<<nbclusters<<
1543 "padPosition="<<padPositions[ic]<<
1544 "padPosTracklet="<<padPosTracklet<<
1549 "signal1="<<signal1<<
1550 "signal2="<<signal2<<
1551 "signal3="<<signal3<<
1552 "signal4="<<signal4<<
1553 "signal5="<<signal5<<
1559 (* fDebugStreamer) << "HandlePRFtrackletV1"<<
1560 "caligroup="<<caligroup<<
1561 "detector="<<fDetectorPreviousTrack<<
1564 "npoints="<<nbclusters<<
1573 "padPosition="<<padPositions[ic]<<
1574 "padPosTracklet="<<padPosTracklet<<
1579 "signal1="<<signal1<<
1580 "signal2="<<signal2<<
1581 "signal3="<<signal3<<
1582 "signal4="<<signal4<<
1583 "signal5="<<signal5<<
1589 (* fDebugStreamer) << "HandlePRFtrackletV1"<<
1590 "caligroup="<<caligroup<<
1591 "detector="<<fDetectorPreviousTrack<<
1594 "npoints="<<nbclusters<<
1603 "padPosition="<<padPositions[ic]<<
1604 "padPosTracklet="<<padPosTracklet<<
1609 "signal1="<<signal1<<
1610 "signal2="<<signal2<<
1611 "signal3="<<signal3<<
1612 "signal4="<<signal4<<
1613 "signal5="<<signal5<<
1619 /////////////////////
1621 /////////////////////
1622 if(nbclusters < fNumberClusters) continue;
1623 if(nbclusters > fNumberClustersf) continue;
1624 if(nb3pc <= 5) continue;
1625 if((time >= 21) || (time < 7)) continue;
1626 if(TMath::Abs(qcl) < 80) continue;
1627 if( TMath::Abs(snp) > 1.) continue;
1630 ////////////////////////
1632 ///////////////////////
1634 if(TMath::Abs(dpad) < 1.5) {
1635 fPRF2d->Fill(shift+dpad,(caligroup+0.5),ycenter);
1636 fPRF2d->Fill(shift-dpad,(caligroup+0.5),ycenter);
1637 //printf("place %f, ycenter %f\n",(shift+dpad),ycenter);
1639 if((ymin > 0.0) && (TMath::Abs(dpad+1.0) < 1.5)) {
1640 fPRF2d->Fill(shift-(dpad+1.0),(caligroup+0.5),ymin);
1641 fPRF2d->Fill(shift+(dpad+1.0),(caligroup+0.5),ymin);
1643 if((ymax > 0.0) && (TMath::Abs(dpad-1.0) < 1.5)) {
1644 fPRF2d->Fill(shift+1.0-dpad,(caligroup+0.5),ymax);
1645 fPRF2d->Fill(shift-1.0+dpad,(caligroup+0.5),ymax);
1650 if(TMath::Abs(dpad) < 1.5) {
1651 fCalibraVector->UpdateVectorPRF(fDetectorPreviousTrack,grouplocal,shift+dpad,ycenter);
1652 fCalibraVector->UpdateVectorPRF(fDetectorPreviousTrack,grouplocal,shift-dpad,ycenter);
1654 if((ymin > 0.0) && (TMath::Abs(dpad+1.0) < 1.5)) {
1655 fCalibraVector->UpdateVectorPRF(fDetectorPreviousTrack,grouplocal,shift-(dpad+1.0),ymin);
1656 fCalibraVector->UpdateVectorPRF(fDetectorPreviousTrack,grouplocal,shift+(dpad+1.0),ymin);
1658 if((ymax > 0.0) && (TMath::Abs(dpad-1.0) < 1.5)) {
1659 fCalibraVector->UpdateVectorPRF(fDetectorPreviousTrack,grouplocal,shift+1.0-dpad,ymax);
1660 fCalibraVector->UpdateVectorPRF(fDetectorPreviousTrack,grouplocal,shift-1.0+dpad,ymax);
1663 } // second loop over clusters
1666 delete [] padPositions;
1670 ///////////////////////////////////////////////////////////////////////////////////////
1671 // Pad row col stuff: see if masked or not
1672 ///////////////////////////////////////////////////////////////////////////////////////
1673 //_____________________________________________________________________________
1674 void AliTRDCalibraFillHisto::CheckGoodTrackletV1(AliTRDcluster *cl)
1677 // See if we are not near a masked pad
1680 if(cl->IsMasked()) fGoodTracklet = kFALSE;
1684 //_____________________________________________________________________________
1685 void AliTRDCalibraFillHisto::CheckGoodTrackletV0(Int_t detector, Int_t row, Int_t col)
1688 // See if we are not near a masked pad
1691 if (!IsPadOn(detector, col, row)) {
1692 fGoodTracklet = kFALSE;
1696 if (!IsPadOn(detector, col-1, row)) {
1697 fGoodTracklet = kFALSE;
1702 if (!IsPadOn(detector, col+1, row)) {
1703 fGoodTracklet = kFALSE;
1708 //_____________________________________________________________________________
1709 Bool_t AliTRDCalibraFillHisto::IsPadOn(Int_t detector, Int_t row, Int_t col) const
1712 // Look in the choosen database if the pad is On.
1713 // If no the track will be "not good"
1716 // Get the parameter object
1717 AliTRDcalibDB *cal = AliTRDcalibDB::Instance();
1719 AliInfo("Could not get calibDB");
1723 if (!cal->IsChamberInstalled(detector) ||
1724 cal->IsChamberMasked(detector) ||
1725 cal->IsPadMasked(detector,col,row)) {
1733 ///////////////////////////////////////////////////////////////////////////////////////
1734 // Calibration groups: calculate the number of groups, localise...
1735 ////////////////////////////////////////////////////////////////////////////////////////
1736 //_____________________________________________________________________________
1737 Int_t AliTRDCalibraFillHisto::CalculateCalibrationGroup(Int_t i, Int_t row, Int_t col) const
1740 // Calculate the calibration group number for i
1743 // Row of the cluster and position in the pad groups
1745 if (fCalibraMode->GetNnZ(i) != 0) {
1746 posr = (Int_t) row / fCalibraMode->GetNnZ(i);
1750 // Col of the cluster and position in the pad groups
1752 if (fCalibraMode->GetNnRphi(i) != 0) {
1753 posc = (Int_t) col / fCalibraMode->GetNnRphi(i);
1756 return posc*fCalibraMode->GetNfragZ(i)+posr;
1759 //____________________________________________________________________________________
1760 Int_t AliTRDCalibraFillHisto::CalculateTotalNumberOfBins(Int_t i)
1763 // Calculate the total number of calibration groups
1769 if((fCalibraMode->GetNz(i)==100) && (fCalibraMode->GetNrphi(i)==100)){
1771 AliInfo(Form("Total number of Xbins: %d for i %d",ntotal,i));
1776 if((fCalibraMode->GetNz(i)==10) && (fCalibraMode->GetNrphi(i)==10)){
1778 AliInfo(Form("Total number of Xbins: %d for i %d",ntotal,i));
1783 fCalibraMode->ModePadCalibration(2,i);
1784 fCalibraMode->ModePadFragmentation(0,2,0,i);
1785 fCalibraMode->SetDetChamb2(i);
1786 ntotal += 6 * 18 * fCalibraMode->GetDetChamb2(i);
1787 fCalibraMode->ModePadCalibration(0,i);
1788 fCalibraMode->ModePadFragmentation(0,0,0,i);
1789 fCalibraMode->SetDetChamb0(i);
1790 ntotal += 6 * 4 * 18 * fCalibraMode->GetDetChamb0(i);
1791 AliInfo(Form("Total number of Xbins: %d for i %d",ntotal,i));
1795 //_____________________________________________________________________________
1796 void AliTRDCalibraFillHisto::SetNz(Int_t i, Short_t Nz)
1799 // Set the mode of calibration group in the z direction for the parameter i
1804 fCalibraMode->SetNz(i, Nz);
1807 AliInfo("You have to choose between 0 and 4");
1811 //_____________________________________________________________________________
1812 void AliTRDCalibraFillHisto::SetNrphi(Int_t i, Short_t Nrphi)
1815 // Set the mode of calibration group in the rphi direction for the parameter i
1820 fCalibraMode->SetNrphi(i ,Nrphi);
1823 AliInfo("You have to choose between 0 and 6");
1828 //_____________________________________________________________________________
1829 void AliTRDCalibraFillHisto::SetAllTogether(Int_t i)
1832 // Set the mode of calibration group all together
1834 if(fVector2d == kTRUE) {
1835 AliInfo("Can not work with the vector method");
1838 fCalibraMode->SetAllTogether(i);
1842 //_____________________________________________________________________________
1843 void AliTRDCalibraFillHisto::SetPerSuperModule(Int_t i)
1846 // Set the mode of calibration group per supermodule
1848 if(fVector2d == kTRUE) {
1849 AliInfo("Can not work with the vector method");
1852 fCalibraMode->SetPerSuperModule(i);
1856 //____________Set the pad calibration variables for the detector_______________
1857 Bool_t AliTRDCalibraFillHisto::LocalisationDetectorXbins(Int_t detector)
1860 // For the detector calcul the first Xbins and set the number of row
1861 // and col pads per calibration groups, the number of calibration
1862 // groups in the detector.
1865 // first Xbins of the detector
1867 fCalibraMode->CalculXBins(detector,0);
1870 fCalibraMode->CalculXBins(detector,1);
1873 fCalibraMode->CalculXBins(detector,2);
1876 // fragmentation of idect
1877 for (Int_t i = 0; i < 3; i++) {
1878 fCalibraMode->ModePadCalibration((Int_t) GetStack(detector),i);
1879 fCalibraMode->ModePadFragmentation((Int_t) GetLayer(detector)
1880 , (Int_t) GetStack(detector)
1881 , (Int_t) GetSector(detector),i);
1887 //_____________________________________________________________________________
1888 void AliTRDCalibraFillHisto::SetNumberGroupsPRF(Short_t numberGroupsPRF)
1891 // Should be between 0 and 6
1894 if ((numberGroupsPRF < 0) || (numberGroupsPRF > 6)) {
1895 AliInfo("The number of groups must be between 0 and 6!");
1898 fNgroupprf = numberGroupsPRF;
1902 ///////////////////////////////////////////////////////////////////////////////////////////
1903 // Per tracklet: store or reset the info, fill the histos with the info
1904 //////////////////////////////////////////////////////////////////////////////////////////
1905 //_____________________________________________________________________________
1906 void AliTRDCalibraFillHisto::StoreInfoCHPHtrack(AliTRDcluster *cl, Double_t dqdl, Int_t *group, Int_t row, Int_t col)
1909 // Store the infos in fAmpTotal, fPHPlace and fPHValue
1910 // Correct from the gain correction before
1913 // time bin of the cluster not corrected
1914 Int_t time = cl->GetPadTime();
1916 //Correct for the gain coefficient used in the database for reconstruction
1917 Float_t correctthegain = 1.0;
1918 if(fIsHLT) correctthegain = fCalDetGain->GetValue(fDetectorPreviousTrack);
1919 else correctthegain = fCalDetGain->GetValue(fDetectorPreviousTrack)*fCalROCGain->GetValue(col,row);
1920 Float_t correction = 1.0;
1921 Float_t normalisation = 6.67;
1922 // we divide with gain in AliTRDclusterizer::Transform...
1923 if( correctthegain > 0 ) normalisation /= correctthegain;
1926 // take dd/dl corrected from the angle of the track
1927 correction = dqdl / (normalisation);
1930 // Fill the fAmpTotal with the charge
1932 if((!fLimitChargeIntegration) || (cl->IsInChamber())) fAmpTotal[(Int_t) group[0]] += correction;
1935 // Fill the fPHPlace and value
1937 fPHPlace[time] = group[1];
1938 fPHValue[time] = correction;
1942 //____________Offine tracking in the AliTRDtracker_____________________________
1943 void AliTRDCalibraFillHisto::ResetfVariablestracklet()
1946 // Reset values per tracklet
1949 //Reset good tracklet
1950 fGoodTracklet = kTRUE;
1952 // Reset the fPHValue
1954 //Reset the fPHValue and fPHPlace
1955 for (Int_t k = 0; k < fTimeMax; k++) {
1961 // Reset the fAmpTotal where we put value
1963 for (Int_t k = 0; k < fCalibraMode->GetNfragZ(0)*fCalibraMode->GetNfragRphi(0); k++) {
1968 //____________Offine tracking in the AliTRDtracker_____________________________
1969 void AliTRDCalibraFillHisto::FillTheInfoOfTheTrackCH(Int_t nbclusters)
1972 // For the offline tracking or mcm tracklets
1973 // This function will be called in the functions UpdateHistogram...
1974 // to fill the info of a track for the relativ gain calibration
1977 Int_t nb = 0; // Nombre de zones traversees
1978 Int_t fd = -1; // Premiere zone non nulle
1979 Float_t totalcharge = 0.0; // Total charge for the supermodule histo
1981 if(nbclusters < fNumberClusters) return;
1982 if(nbclusters > fNumberClustersf) return;
1985 // Normalize with the number of clusters
1986 Double_t normalizeCst = fRelativeScale;
1987 if(fNormalizeNbOfCluster) normalizeCst = normalizeCst*nbclusters;
1989 // See if the track goes through different zones
1990 for (Int_t k = 0; k < fCalibraMode->GetNfragZ(0)*fCalibraMode->GetNfragRphi(0); k++) {
1991 if (fAmpTotal[k] > 0.0) {
1992 totalcharge += fAmpTotal[k];
2005 fEntriesCH[fCalibraMode->GetXbins(0)+fd]++;
2007 FillCH2d(fCalibraMode->GetXbins(0)+fd,fAmpTotal[fd]/normalizeCst);
2008 //fCH2d->Fill(fAmpTotal[fd]/normalizeCst,fCalibraMode->GetXbins(0)+fd+0.5);
2011 fCalibraVector->UpdateVectorCH(fDetectorPreviousTrack,fd,fAmpTotal[fd]/normalizeCst);
2015 if ((fAmpTotal[fd] > 0.0) &&
2016 (fAmpTotal[fd+1] > 0.0)) {
2017 // One of the two very big
2018 if (fAmpTotal[fd] > fProcent*fAmpTotal[fd+1]) {
2020 FillCH2d(fCalibraMode->GetXbins(0)+fd,fAmpTotal[fd]/normalizeCst);
2021 //fCH2d->Fill(fAmpTotal[fd]/normalizeCst,fCalibraMode->GetXbins(0)+fd+0.5);
2024 fCalibraVector->UpdateVectorCH(fDetectorPreviousTrack,fd,fAmpTotal[fd]/normalizeCst);
2027 fEntriesCH[fCalibraMode->GetXbins(0)+fd]++;
2029 if (fAmpTotal[fd+1] > fProcent*fAmpTotal[fd]) {
2031 FillCH2d(fCalibraMode->GetXbins(0)+fd+1,fAmpTotal[fd+1]/normalizeCst);
2032 //fCH2d->Fill(fAmpTotal[fd+1]/normalizeCst,fCalibraMode->GetXbins(0)+fd+1.5);
2035 fCalibraVector->UpdateVectorCH(fDetectorPreviousTrack,fd+1,fAmpTotal[fd+1]/normalizeCst);
2038 fEntriesCH[fCalibraMode->GetXbins(0)+fd+1]++;
2041 if (fCalibraMode->GetNfragZ(0) > 1) {
2042 if (fAmpTotal[fd] > 0.0) {
2043 if ((fd+fCalibraMode->GetNfragZ(0)) < (fCalibraMode->GetNfragZ(0)*fCalibraMode->GetNfragRphi(0))) {
2044 if (fAmpTotal[fd+fCalibraMode->GetNfragZ(0)] > 0.0) {
2045 // One of the two very big
2046 if (fAmpTotal[fd] > fProcent*fAmpTotal[fd+fCalibraMode->GetNfragZ(0)]) {
2048 FillCH2d(fCalibraMode->GetXbins(0)+fd,fAmpTotal[fd]/normalizeCst);
2049 //fCH2d->Fill(fAmpTotal[fd]/normalizeCst,fCalibraMode->GetXbins(0)+fd+0.5);
2052 fCalibraVector->UpdateVectorCH(fDetectorPreviousTrack,fd,fAmpTotal[fd]/normalizeCst);
2055 fEntriesCH[fCalibraMode->GetXbins(0)+fd]++;
2057 if (fAmpTotal[fd+fCalibraMode->GetNfragZ(0)] > fProcent*fAmpTotal[fd]) {
2059 FillCH2d(fCalibraMode->GetXbins(0)+fd+fCalibraMode->GetNfragZ(0),fAmpTotal[fd+fCalibraMode->GetNfragZ(0)]/normalizeCst);
2060 //fCH2d->Fill(fAmpTotal[fd+fCalibraMode->GetNfragZ(0)]/normalizeCst,fCalibraMode->GetXbins(0)+fd+fCalibraMode->GetNfragZ(0)+0.5);
2063 fEntriesCH[fCalibraMode->GetXbins(0)+fd+fCalibraMode->GetNfragZ(0)]++;
2065 fCalibraVector->UpdateVectorCH(fDetectorPreviousTrack,fd+fCalibraMode->GetNfragZ(0),fAmpTotal[fd+fCalibraMode->GetNfragZ(0)]/normalizeCst);
2076 //____________Offine tracking in the AliTRDtracker_____________________________
2077 void AliTRDCalibraFillHisto::FillTheInfoOfTheTrackPH()
2080 // For the offline tracking or mcm tracklets
2081 // This function will be called in the functions UpdateHistogram...
2082 // to fill the info of a track for the drift velocity calibration
2085 Int_t nb = 1; // Nombre de zones traversees 1, 2 ou plus de 3
2086 Int_t fd1 = -1; // Premiere zone non nulle
2087 Int_t fd2 = -1; // Deuxieme zone non nulle
2088 Int_t k1 = -1; // Debut de la premiere zone
2089 Int_t k2 = -1; // Debut de la seconde zone
2090 Int_t nbclusters = 0; // number of clusters
2094 // See if the track goes through different zones
2095 for (Int_t k = 0; k < fTimeMax; k++) {
2096 if (fPHValue[k] > 0.0) {
2102 if (fPHPlace[k] != fd1) {
2108 if (fPHPlace[k] != fd2) {
2115 // See if noise before and after
2116 if(fMaxCluster > 0) {
2117 if(fPHValue[0] > fMaxCluster) return;
2118 if(fTimeMax > fNbMaxCluster) {
2119 for(Int_t k = (fTimeMax-fNbMaxCluster); k < fTimeMax; k++){
2120 if(fPHValue[k] > fMaxCluster) return;
2125 //printf("nbclusters %d, low limit %d, high limit %d\n",nbclusters,fNumberClusters,fNumberClustersf);
2127 if(nbclusters < fNumberClusters) return;
2128 if(nbclusters > fNumberClustersf) return;
2134 for (Int_t i = 0; i < fTimeMax; i++) {
2136 if(fFillWithZero) fPH2d->Fill((Float_t) i/fSf,(fCalibraMode->GetXbins(1)+fd1)+0.5,(Float_t) fPHValue[i]);
2138 if(((Float_t) fPHValue[i] > 0.0)) fPH2d->Fill((Float_t) i/fSf,(fCalibraMode->GetXbins(1)+fd1)+0.5,(Float_t) fPHValue[i]);
2140 //printf("Fill the time bin %d with %f\n",i,fPHValue[i]);
2143 if(fFillWithZero) fCalibraVector->UpdateVectorPH(fDetectorPreviousTrack,fd1,i,fPHValue[i]);
2145 if(((Float_t) fPHValue[i] > 0.0)) fCalibraVector->UpdateVectorPH(fDetectorPreviousTrack,fd1,i,fPHValue[i]);
2151 if ((fd1 == fd2+1) ||
2153 // One of the two fast all the think
2154 if (k2 > (k1+fDifference)) {
2155 //we choose to fill the fd1 with all the values
2157 for (Int_t i = 0; i < fTimeMax; i++) {
2159 if(fFillWithZero) fPH2d->Fill((Float_t) i/fSf,(fCalibraMode->GetXbins(1)+fd1)+0.5,(Float_t) fPHValue[i]);
2161 if(((Float_t) fPHValue[i] > 0.0)) fPH2d->Fill((Float_t) i/fSf,(fCalibraMode->GetXbins(1)+fd1)+0.5,(Float_t) fPHValue[i]);
2165 if(fFillWithZero) fCalibraVector->UpdateVectorPH(fDetectorPreviousTrack,fd1,i,fPHValue[i]);
2167 if(((Float_t) fPHValue[i] > 0.0)) fCalibraVector->UpdateVectorPH(fDetectorPreviousTrack,fd1,i,fPHValue[i]);
2172 if ((k2+fDifference) < fTimeMax) {
2173 //we choose to fill the fd2 with all the values
2175 for (Int_t i = 0; i < fTimeMax; i++) {
2177 if(fFillWithZero) fPH2d->Fill((Float_t) i/fSf,(fCalibraMode->GetXbins(1)+fd2)+0.5,(Float_t) fPHValue[i]);
2179 if(((Float_t) fPHValue[i] > 0.0)) fPH2d->Fill((Float_t) i/fSf,(fCalibraMode->GetXbins(1)+fd2)+0.5,(Float_t) fPHValue[i]);
2183 if(fFillWithZero) fCalibraVector->UpdateVectorPH(fDetectorPreviousTrack,fd2,i,fPHValue[i]);
2185 if(((Float_t) fPHValue[i] > 0.0)) fCalibraVector->UpdateVectorPH(fDetectorPreviousTrack,fd2,i,fPHValue[i]);
2191 // Two zones voisines sinon rien!
2192 if (fCalibraMode->GetNfragZ(1) > 1) {
2194 if ((fd1+fCalibraMode->GetNfragZ(1)) < (fCalibraMode->GetNfragZ(1)*fCalibraMode->GetNfragRphi(1))) {
2195 if (fd2 == (fd1+fCalibraMode->GetNfragZ(1))) {
2196 // One of the two fast all the think
2197 if (k2 > (k1+fDifference)) {
2198 //we choose to fill the fd1 with all the values
2200 for (Int_t i = 0; i < fTimeMax; i++) {
2202 if(fFillWithZero) fPH2d->Fill((Float_t) i/fSf,(fCalibraMode->GetXbins(1)+fd1)+0.5,(Float_t) fPHValue[i]);
2204 if(((Float_t) fPHValue[i] > 0.0)) fPH2d->Fill((Float_t) i/fSf,(fCalibraMode->GetXbins(1)+fd1)+0.5,(Float_t) fPHValue[i]);
2208 if(fFillWithZero) fCalibraVector->UpdateVectorPH(fDetectorPreviousTrack,fd1,i,fPHValue[i]);
2210 if(((Float_t) fPHValue[i] > 0.0)) fCalibraVector->UpdateVectorPH(fDetectorPreviousTrack,fd1,i,fPHValue[i]);
2215 if ((k2+fDifference) < fTimeMax) {
2216 //we choose to fill the fd2 with all the values
2218 for (Int_t i = 0; i < fTimeMax; i++) {
2220 if(fFillWithZero) fPH2d->Fill((Float_t) i/fSf,(fCalibraMode->GetXbins(1)+fd2)+0.5,(Float_t) fPHValue[i]);
2222 if(((Float_t) fPHValue[i] > 0.0)) fPH2d->Fill((Float_t) i/fSf,(fCalibraMode->GetXbins(1)+fd2)+0.5,(Float_t) fPHValue[i]);
2226 if(fFillWithZero) fCalibraVector->UpdateVectorPH(fDetectorPreviousTrack,fd2,i,fPHValue[i]);
2228 if(((Float_t) fPHValue[i] > 0.0)) fCalibraVector->UpdateVectorPH(fDetectorPreviousTrack,fd2,i,fPHValue[i]);
2235 // Two zones voisines sinon rien!
2237 if ((fd1 - fCalibraMode->GetNfragZ(1)) >= 0) {
2238 if (fd2 == (fd1 - fCalibraMode->GetNfragZ(1))) {
2239 // One of the two fast all the think
2240 if (k2 > (k1 + fDifference)) {
2241 //we choose to fill the fd1 with all the values
2243 for (Int_t i = 0; i < fTimeMax; i++) {
2245 if(fFillWithZero) fPH2d->Fill((Float_t) i/fSf,(fCalibraMode->GetXbins(1)+fd1)+0.5,(Float_t) fPHValue[i]);
2247 if(((Float_t) fPHValue[i] > 0.0)) fPH2d->Fill((Float_t) i/fSf,(fCalibraMode->GetXbins(1)+fd1)+0.5,(Float_t) fPHValue[i]);
2251 if(fFillWithZero) fCalibraVector->UpdateVectorPH(fDetectorPreviousTrack,fd1,i,fPHValue[i]);
2253 if(((Float_t) fPHValue[i] > 0.0)) fCalibraVector->UpdateVectorPH(fDetectorPreviousTrack,fd1,i,fPHValue[i]);
2258 if ((k2+fDifference) < fTimeMax) {
2259 //we choose to fill the fd2 with all the values
2261 for (Int_t i = 0; i < fTimeMax; i++) {
2263 if(fFillWithZero) fPH2d->Fill((Float_t) i/fSf,(fCalibraMode->GetXbins(1)+fd2)+0.5,(Float_t) fPHValue[i]);
2265 if(((Float_t) fPHValue[i] > 0.0)) fPH2d->Fill((Float_t) i/fSf,(fCalibraMode->GetXbins(1)+fd2)+0.5,(Float_t) fPHValue[i]);
2269 if(fFillWithZero) fCalibraVector->UpdateVectorPH(fDetectorPreviousTrack,fd2,i,fPHValue[i]);
2271 if(((Float_t) fPHValue[i] > 0.0)) fCalibraVector->UpdateVectorPH(fDetectorPreviousTrack,fd2,i,fPHValue[i]);
2283 //////////////////////////////////////////////////////////////////////////////////////////
2284 // DAQ process functions
2285 /////////////////////////////////////////////////////////////////////////////////////////
2286 //_____________________________________________________________________
2287 Int_t AliTRDCalibraFillHisto::ProcessEventDAQ(AliTRDrawStreamBase *rawStream, Bool_t nocheck)
2290 // Event Processing loop - AliTRDrawStreamBase
2291 // TestBeam 2007 version
2292 // 0 timebin problem
2296 // Same algorithm as TestBeam but different reader
2299 Int_t withInput = 1;
2301 Double_t phvalue[16][144][36];
2302 for(Int_t k = 0; k < 36; k++){
2303 for(Int_t j = 0; j < 16; j++){
2304 for(Int_t c = 0; c < 144; c++){
2305 phvalue[j][c][k] = 0.0;
2310 fDetectorPreviousTrack = -1;
2313 Int_t nbtimebin = 0;
2314 Int_t baseline = 10;
2321 while (rawStream->Next()) {
2323 Int_t idetector = rawStream->GetDet(); // current detector
2324 Int_t imcm = rawStream->GetMCM(); // current MCM
2325 Int_t irob = rawStream->GetROB(); // current ROB
2327 //printf("Detector %d\n",idetector);
2329 if((fDetectorPreviousTrack != idetector) && (fDetectorPreviousTrack != -1)){
2332 withInput = TMath::Max(FillDAQ(phvalue),withInput);
2336 for(Int_t k = 0; k < 36; k++){
2337 for(Int_t j = 0; j < 16; j++){
2338 for(Int_t c = 0; c < 144; c++){
2339 phvalue[j][c][k] = 0.0;
2345 fDetectorPreviousTrack = idetector;
2346 fMCMPrevious = imcm;
2347 fROBPrevious = irob;
2349 nbtimebin = rawStream->GetNumberOfTimeBins(); // number of time bins read from data
2350 if(nbtimebin == 0) return 0;
2351 if((fTimeMax != 0) && (nbtimebin != fTimeMax)) return 0;
2352 fTimeMax = nbtimebin;
2354 //baseline = rawStream->GetCommonAdditive(); // common additive baseline
2355 fNumberClustersf = fTimeMax;
2356 fNumberClusters = (Int_t)(0.6*fTimeMax);
2359 Int_t *signal = rawStream->GetSignals(); // current ADC signal
2360 Int_t col = rawStream->GetCol();
2361 Int_t row = rawStream->GetRow();
2364 //printf("detector %d, signal[0] %d, signal[1] %d, signal[2] %d, baseline %d\n",idetector,signal[0],signal[1],signal[2], baseline);
2367 for(Int_t itime = 0; itime < nbtimebin; itime++){
2368 phvalue[row][col][itime] = signal[itime]-baseline;
2372 // fill the last one
2373 if(fDetectorPreviousTrack != -1){
2376 withInput = TMath::Max(FillDAQ(phvalue),withInput);
2379 for(Int_t k = 0; k < 36; k++){
2380 for(Int_t j = 0; j < 16; j++){
2381 for(Int_t c = 0; c < 144; c++){
2382 phvalue[j][c][k] = 0.0;
2391 while (rawStream->Next()) {
2393 Int_t idetector = rawStream->GetDet(); // current detector
2394 Int_t imcm = rawStream->GetMCM(); // current MCM
2395 Int_t irob = rawStream->GetROB(); // current ROB
2397 //printf("Detector %d\n",idetector);
2399 if((fDetectorPreviousTrack != idetector) && (fDetectorPreviousTrack != -1)){
2402 withInput = TMath::Max(FillDAQ(phvalue),withInput);
2405 for(Int_t k = 0; k < 36; k++){
2406 for(Int_t j = 0; j < 16; j++){
2407 for(Int_t c = 0; c < 144; c++){
2408 phvalue[j][c][k] = 0.0;
2414 fDetectorPreviousTrack = idetector;
2415 fMCMPrevious = imcm;
2416 fROBPrevious = irob;
2418 //baseline = rawStream->GetCommonAdditive(); // common baseline
2420 fTimeMax = rawStream->GetNumberOfTimeBins(); // number of time bins read from data
2421 fNumberClustersf = fTimeMax;
2422 fNumberClusters = (Int_t)(0.6*fTimeMax);
2423 Int_t *signal = rawStream->GetSignals(); // current ADC signal
2424 Int_t col = rawStream->GetCol();
2425 Int_t row = rawStream->GetRow();
2428 //printf("detector %d, signal[0] %d, signal[1] %d, signal[2] %d, baseline %d\n",idetector,signal[0],signal[1],signal[2], baseline);
2430 for(Int_t itime = 0; itime < fTimeMax; itime++){
2431 phvalue[row][col][itime] = signal[itime]-baseline;
2435 // fill the last one
2436 if(fDetectorPreviousTrack != -1){
2439 withInput = TMath::Max(FillDAQ(phvalue),withInput);
2442 for(Int_t k = 0; k < 36; k++){
2443 for(Int_t j = 0; j < 16; j++){
2444 for(Int_t c = 0; c < 144; c++){
2445 phvalue[j][c][k] = 0.0;
2455 //_____________________________________________________________________
2456 Int_t AliTRDCalibraFillHisto::ProcessEventDAQ(AliRawReader *rawReader, Bool_t nocheck)
2459 // Event processing loop - AliRawReader
2460 // Testbeam 2007 version
2463 AliTRDrawStreamBase rawStream(rawReader);
2465 rawReader->Select("TRD");
2467 return ProcessEventDAQ(&rawStream, nocheck);
2470 //_________________________________________________________________________
2471 Int_t AliTRDCalibraFillHisto::ProcessEventDAQ(
2473 eventHeaderStruct *event,
2476 eventHeaderStruct* /*event*/,
2483 // process date event
2484 // Testbeam 2007 version
2487 AliRawReader *rawReader = new AliRawReaderDate((void*)event);
2488 Int_t result=ProcessEventDAQ(rawReader, nocheck);
2492 Fatal("AliTRDCalibraFillHisto", "this class was compiled without DATE");
2497 //////////////////////////////////////////////////////////////////////////////
2498 // Routine inside the DAQ process
2499 /////////////////////////////////////////////////////////////////////////////
2500 //_______________________________________________________________________
2501 Int_t AliTRDCalibraFillHisto::FillDAQ(Double_t phvalue[16][144][36]){
2504 // Look for the maximum by collapsing over the time
2505 // Sum over four pad col and two pad row
2511 Int_t idect = fDetectorPreviousTrack;
2512 //printf("Enter Detector %d\n",fDetectorPreviousTrack);
2514 for(Int_t tb = 0; tb < 36; tb++){
2518 //fGoodTracklet = kTRUE;
2519 //fDetectorPreviousTrack = 0;
2522 ///////////////////////////
2524 /////////////////////////
2528 Double_t integralMax = -1;
2530 for (Int_t ir = 1; ir <= 15; ir++)
2532 for (Int_t ic = 2; ic <= 142; ic++)
2534 Double_t integral = 0;
2535 for (Int_t ishiftR = 0; ishiftR < 2; ishiftR++)
2537 for (Int_t ishiftC = -2; ishiftC < 2; ishiftC++)
2539 if (ir + ishiftR >= 1 && ir + ishiftR <= 16 &&
2540 ic + ishiftC >= 1 && ic + ishiftC <= 144)
2543 for(Int_t tb = 0; tb< fTimeMax; tb++){
2544 integral += phvalue[ir + ishiftR-1][ic + ishiftC-1][tb];
2550 if (integralMax < integral)
2554 integralMax = integral;
2555 } // check max integral
2559 //printf("imaxRow %d, imaxCol %d, fTimeMax %d, integralMax %f\n",imaxRow,imaxCol,fTimeMax, integralMax);
2561 if((imaxRow == 0) || (imaxCol == 0)) {
2565 //CheckGoodTrackletV0(fDetectorPreviousTrack,imaxRow,imaxCol);
2566 //if(!fGoodTracklet) used = 1;;
2568 // /////////////////////////////////////////////////////
2569 // sum ober 2 row and 4 pad cols for each time bins
2570 // ////////////////////////////////////////////////////
2573 for (Int_t ir = imaxRow - 1; ir < imaxRow + 1; ir++)
2575 for (Int_t ic = imaxCol - 2; ic < imaxCol + 2; ic++)
2577 for(Int_t it = 0; it < fTimeMax; it++){
2578 sum[it] += phvalue[ir][ic][it];
2584 Double_t sumcharge = 0.0;
2585 for(Int_t it = 0; it < fTimeMax; it++){
2586 sumcharge += sum[it];
2587 if(sum[it] > 20.0) nbcl++;
2591 /////////////////////////////////////////////////////////
2593 ////////////////////////////////////////////////////////
2594 if(fDebugLevel > 0){
2595 if ( !fDebugStreamer ) {
2597 TDirectory *backup = gDirectory;
2598 fDebugStreamer = new TTreeSRedirector("TRDdebugCalibraFill.root");
2599 if ( backup ) backup->cd(); //we don't want to be cd'd to the debug streamer
2602 Double_t amph0 = sum[0];
2603 Double_t amphlast = sum[fTimeMax-1];
2604 Double_t rms = TMath::RMS(fTimeMax,sum);
2605 Int_t goodtracklet = (Int_t) fGoodTracklet;
2606 for(Int_t it = 0; it < fTimeMax; it++){
2607 Double_t clustera = sum[it];
2609 (* fDebugStreamer) << "FillDAQa"<<
2610 "ampTotal="<<sumcharge<<
2613 "detector="<<idect<<
2615 "amphlast="<<amphlast<<
2616 "goodtracklet="<<goodtracklet<<
2617 "clustera="<<clustera<<
2624 ////////////////////////////////////////////////////////
2626 ///////////////////////////////////////////////////////
2627 if(sum[0] > 100.0) used = 1;
2628 if(nbcl < fNumberClusters) used = 1;
2629 if(nbcl > fNumberClustersf) used = 1;
2631 //if(fDetectorPreviousTrack == 15){
2632 // printf("rms %f and first time bin %f\n",TMath::RMS(fTimeMax,sum),sum[0]);
2634 //if((TMath::RMS(fTimeMax,sum) <= 10.0) && (sum[0] > 200.0)) return 1;
2636 for(Int_t it = 0; it < fTimeMax; it++){
2637 if(fFillWithZero) UpdateDAQ(fDetectorPreviousTrack,0,0,it,sum[it],fTimeMax);
2639 if(sum[it] > 0.0) UpdateDAQ(fDetectorPreviousTrack,0,0,it,sum[it],fTimeMax);
2644 //((TH2I *)GetCH2d()->Fill(sumcharge/30.0,fDetectorPreviousTrack));
2646 //printf("Pass Detector %d\n",fDetectorPreviousTrack);
2653 //____________Online trackling in AliTRDtrigger________________________________
2654 Bool_t AliTRDCalibraFillHisto::UpdateDAQ(Int_t det, Int_t /*row*/, Int_t /*col*/, Int_t timebin, Float_t signal, Int_t nbtimebins)
2658 // Fill a simple average pulse height
2662 ((TProfile2D *)GetPH2d(nbtimebins,fSf))->Fill((Float_t) timebin/fSf,det+0.5,(Float_t) signal);
2668 //____________Write_____________________________________________________
2669 //_____________________________________________________________________
2670 void AliTRDCalibraFillHisto::Write2d(const Char_t *filename, Bool_t append)
2673 // Write infos to file
2677 if ( fDebugStreamer ) {
2678 delete fDebugStreamer;
2679 fDebugStreamer = 0x0;
2682 AliInfo(Form("Numbertrack: %d Numberusedch[0]: %d, Numberusedch[1]: %d Numberusedph[0]: %d, Numberusedph[1]: %d"
2687 ,fNumberUsedPh[1]));
2689 TDirectory *backup = gDirectory;
2695 option = "recreate";
2697 TFile f(filename,option.Data());
2699 TStopwatch stopwatch;
2702 f.WriteTObject(fCalibraVector);
2707 f.WriteTObject(fCH2d);
2712 f.WriteTObject(fPH2d);
2717 f.WriteTObject(fPRF2d);
2720 if(fLinearFitterOn){
2721 AnalyseLinearFitter();
2722 f.WriteTObject(fLinearVdriftFit);
2727 if ( backup ) backup->cd();
2729 AliInfo(Form("Execution time Write2d: R:%.2fs C:%.2fs"
2730 ,stopwatch.RealTime(),stopwatch.CpuTime()));
2732 //////////////////////////////////////////////////////////////////////////////////////////////////////////////
2734 //////////////////////////////////////////////////////////////////////////////////////////////////////////////
2735 //___________________________________________probe the histos__________________________________________________
2736 Double_t *AliTRDCalibraFillHisto::StatH(TH2 *h, Int_t i)
2739 // Check the number of stats in h, 0 is TH2I 1 is TProfile2D
2740 // debug mode with 2 for TH2I and 3 for TProfile2D
2741 // It gives a pointer to a Double_t[7] with the info following...
2742 // [0] : number of calibration groups with entries
2743 // [1] : minimal number of entries found
2744 // [2] : calibration group number of the min
2745 // [3] : maximal number of entries found
2746 // [4] : calibration group number of the max
2747 // [5] : mean number of entries found
2748 // [6] : mean relative error
2751 Double_t *info = new Double_t[7];
2753 // Number of Xbins (detectors or groups of pads)
2754 Int_t nbins = h->GetNbinsY(); //number of calibration groups
2755 Int_t nxbins = h->GetNbinsX(); //number of bins per histo
2758 Double_t nbwe = 0; //number of calibration groups with entries
2759 Double_t minentries = 0; //minimal number of entries found
2760 Double_t maxentries = 0; //maximal number of entries found
2761 Double_t placemin = 0; //calibration group number of the min
2762 Double_t placemax = -1; //calibration group number of the max
2763 Double_t meanstats = 0.0; //mean number of entries over the calibration group with at least ome entry
2764 Double_t meanrelativerror = 0.0; //mean relativ error in the TProfile2D
2766 Double_t counter = 0;
2769 TH1F *nbEntries = 0x0;//distribution of the number of entries
2770 TH1F *nbEntriesPerGroup = 0x0;//Number of entries per group
2771 TProfile *nbEntriesPerSp = 0x0;//Number of entries for one supermodule
2773 // Beginning of the loop over the calibration groups
2774 for (Int_t idect = 0; idect < nbins; idect++) {
2776 TH1I *projch = (TH1I *) h->ProjectionX("projch",idect+1,idect+1,(Option_t *)"e");
2777 projch->SetDirectory(0);
2779 // Number of entries for this calibration group
2780 Double_t nentries = 0.0;
2782 for (Int_t k = 0; k < nxbins; k++) {
2783 nentries += h->GetBinContent(h->GetBin(k+1,idect+1));
2787 for (Int_t k = 0; k < nxbins; k++) {
2788 nentries += ((TProfile2D *)h)->GetBinEntries(h->GetBin(k+1,idect+1));
2789 if(h->GetBinContent(h->GetBin(k+1,idect+1)) != 0) {
2790 meanrelativerror += (h->GetBinError(h->GetBin(k+1,idect+1))/(TMath::Abs(h->GetBinContent(h->GetBin(k+1,idect+1)))));
2798 if((!((Bool_t)nbEntries)) && (nentries > 0)){
2799 nbEntries = new TH1F("Number of entries","Number of entries"
2800 ,100,(Int_t)nentries/2,nentries*2);
2801 nbEntries->SetDirectory(0);
2802 nbEntriesPerGroup = new TH1F("Number of entries per group","Number of entries per group"
2804 nbEntriesPerGroup->SetDirectory(0);
2805 nbEntriesPerSp = new TProfile("Number of entries per supermodule","Number of entries per supermodule"
2806 ,(Int_t)(nbins/18),0,(Int_t)(nbins/18));
2807 nbEntriesPerSp->SetDirectory(0);
2810 if(nentries > 0) nbEntries->Fill(nentries);
2811 nbEntriesPerGroup->Fill(idect+0.5,nentries);
2812 nbEntriesPerSp->Fill((idect%((Int_t)(nbins/18)))+0.5,nentries);
2817 if(nentries > maxentries){
2818 maxentries = nentries;
2822 minentries = nentries;
2824 if(nentries < minentries){
2825 minentries = nentries;
2831 meanstats += nentries;
2833 }//calibration groups loop
2835 if(nbwe > 0) meanstats /= nbwe;
2836 if(counter > 0) meanrelativerror /= counter;
2838 AliInfo(Form("There are %f calibration groups with entries",nbwe));
2839 AliInfo(Form("The minimum number of entries is %f for the group %f",minentries,placemin));
2840 AliInfo(Form("The maximum number of entries is %f for the group %f",maxentries,placemax));
2841 AliInfo(Form("The mean number of entries is %f",meanstats));
2842 if((i%2) == 1) AliInfo(Form("The mean relative error is %f",meanrelativerror));
2845 info[1] = minentries;
2847 info[3] = maxentries;
2849 info[5] = meanstats;
2850 info[6] = meanrelativerror;
2853 gStyle->SetPalette(1);
2854 gStyle->SetOptStat(1111);
2855 gStyle->SetPadBorderMode(0);
2856 gStyle->SetCanvasColor(10);
2857 gStyle->SetPadLeftMargin(0.13);
2858 gStyle->SetPadRightMargin(0.01);
2859 TCanvas *stat = new TCanvas("stat","",50,50,600,800);
2862 nbEntries->Draw("");
2864 nbEntriesPerSp->SetStats(0);
2865 nbEntriesPerSp->Draw("");
2866 TCanvas *stat1 = new TCanvas("stat1","",50,50,600,800);
2868 nbEntriesPerGroup->SetStats(0);
2869 nbEntriesPerGroup->Draw("");
2875 //____________________________________________________________________________
2876 Double_t *AliTRDCalibraFillHisto::GetMeanMedianRMSNumberCH()
2879 // Return a Int_t[4] with:
2880 // 0 Mean number of entries
2881 // 1 median of number of entries
2882 // 2 rms of number of entries
2883 // 3 number of group with entries
2886 Double_t *stat = new Double_t[4];
2889 Int_t nbofgroups = CalculateTotalNumberOfBins(0);
2890 Double_t *weight = new Double_t[nbofgroups];
2891 Int_t *nonul = new Int_t[nbofgroups];
2893 for(Int_t k = 0; k < nbofgroups; k++){
2894 if(fEntriesCH[k] > 0) {
2896 nonul[(Int_t)stat[3]] = fEntriesCH[k];
2899 else weight[k] = 0.0;
2901 stat[0] = TMath::Mean(nbofgroups,fEntriesCH,weight);
2902 stat[1] = TMath::Median(nbofgroups,fEntriesCH,weight);
2903 stat[2] = TMath::RMS((Int_t)stat[3],nonul);
2908 //____________________________________________________________________________
2909 Double_t *AliTRDCalibraFillHisto::GetMeanMedianRMSNumberLinearFitter() const
2912 // Return a Int_t[4] with:
2913 // 0 Mean number of entries
2914 // 1 median of number of entries
2915 // 2 rms of number of entries
2916 // 3 number of group with entries
2919 Double_t *stat = new Double_t[4];
2922 Int_t nbofgroups = 540;
2923 Double_t *weight = new Double_t[nbofgroups];
2924 Int_t *nonul = new Int_t[nbofgroups];
2926 for(Int_t k = 0; k < nbofgroups; k++){
2927 if(fEntriesLinearFitter[k] > 0) {
2929 nonul[(Int_t) stat[3]] = fEntriesLinearFitter[k];
2932 else weight[k] = 0.0;
2934 stat[0] = TMath::Mean(nbofgroups,fEntriesLinearFitter,weight);
2935 stat[1] = TMath::Median(nbofgroups,fEntriesLinearFitter,weight);
2936 stat[2] = TMath::RMS((Int_t)stat[3],nonul);
2941 //////////////////////////////////////////////////////////////////////////////////////
2943 //////////////////////////////////////////////////////////////////////////////////////
2944 //_____________________________________________________________________________
2945 void AliTRDCalibraFillHisto::CreatePRF2d(Int_t nn)
2948 // Create the 2D histos: here we have 2*fNgroupprf bins in tnp of 0.2 amplitude each
2949 // If fNgroupprf is zero then no binning in tnp
2953 name += fCalibraMode->GetNz(2);
2955 name += fCalibraMode->GetNrphi(2);
2959 if(fNgroupprf != 0){
2961 fPRF2d = new TProfile2D("PRF2d",(const Char_t *) name
2962 ,2*fNgroupprf*fNumberBinPRF,-3.0*fNgroupprf,3.0*fNgroupprf,nn,0,nn);
2963 fPRF2d->SetYTitle("Det/pad groups");
2964 fPRF2d->SetXTitle("Position x/W [pad width units]");
2965 fPRF2d->SetZTitle("Q_{i}/Q_{total}");
2966 fPRF2d->SetStats(0);
2969 fPRF2d = new TProfile2D("PRF2d",(const Char_t *) name
2970 ,fNumberBinPRF,-1.5,1.5,nn,0,nn);
2971 fPRF2d->SetYTitle("Det/pad groups");
2972 fPRF2d->SetXTitle("Position x/W [pad width units]");
2973 fPRF2d->SetZTitle("Q_{i}/Q_{total}");
2974 fPRF2d->SetStats(0);
2979 //_____________________________________________________________________________
2980 void AliTRDCalibraFillHisto::CreatePH2d(Int_t nn)
2983 // Create the 2D histos
2987 name += fCalibraMode->GetNz(1);
2989 name += fCalibraMode->GetNrphi(1);
2991 fPH2d = new TProfile2D("PH2d",(const Char_t *) name
2992 ,fTimeMax,-0.5/fSf,(Float_t) (fTimeMax-0.5)/fSf
2994 fPH2d->SetYTitle("Det/pad groups");
2995 fPH2d->SetXTitle("time [#mus]");
2996 fPH2d->SetZTitle("<PH> [a.u.]");
3000 //_____________________________________________________________________________
3001 void AliTRDCalibraFillHisto::CreateCH2d(Int_t nn)
3004 // Create the 2D histos
3008 name += fCalibraMode->GetNz(0);
3010 name += fCalibraMode->GetNrphi(0);
3012 fCH2d = new TH2I("CH2d",(const Char_t *) name
3013 ,fNumberBinCharge,0,300,nn,0,nn);
3014 fCH2d->SetYTitle("Det/pad groups");
3015 fCH2d->SetXTitle("charge deposit [a.u]");
3016 fCH2d->SetZTitle("counts");
3021 //////////////////////////////////////////////////////////////////////////////////
3022 // Set relative scale
3023 /////////////////////////////////////////////////////////////////////////////////
3024 //_____________________________________________________________________________
3025 void AliTRDCalibraFillHisto::SetRelativeScale(Float_t RelativeScale)
3028 // Set the factor that will divide the deposited charge
3029 // to fit in the histo range [0,300]
3032 if (RelativeScale > 0.0) {
3033 fRelativeScale = RelativeScale;
3036 AliInfo("RelativeScale must be strict positif!");
3040 //////////////////////////////////////////////////////////////////////////////////
3041 // Quick way to fill a histo
3042 //////////////////////////////////////////////////////////////////////////////////
3043 //_____________________________________________________________________
3044 void AliTRDCalibraFillHisto::FillCH2d(Int_t x, Float_t y)
3047 // FillCH2d: Marian style
3050 //skip simply the value out of range
3051 if((y>=300.0) || (y<0.0)) return;
3053 //Calcul the y place
3054 Int_t yplace = (Int_t) (fNumberBinCharge*y/300.0)+1;
3055 Int_t place = (fNumberBinCharge+2)*(x+1)+yplace;
3058 fCH2d->GetArray()[place]++;
3062 //////////////////////////////////////////////////////////////////////////////////
3063 // Geometrical functions
3064 ///////////////////////////////////////////////////////////////////////////////////
3065 //_____________________________________________________________________________
3066 Int_t AliTRDCalibraFillHisto::GetLayer(Int_t d) const
3069 // Reconstruct the layer number from the detector number
3072 return ((Int_t) (d % 6));
3076 //_____________________________________________________________________________
3077 Int_t AliTRDCalibraFillHisto::GetStack(Int_t d) const
3080 // Reconstruct the stack number from the detector number
3082 const Int_t kNlayer = 6;
3084 return ((Int_t) (d % 30) / kNlayer);
3088 //_____________________________________________________________________________
3089 Int_t AliTRDCalibraFillHisto::GetSector(Int_t d) const
3092 // Reconstruct the sector number from the detector number
3096 return ((Int_t) (d / fg));
3099 ///////////////////////////////////////////////////////////////////////////////////
3100 // Getter functions for DAQ of the CH2d and the PH2d
3101 //////////////////////////////////////////////////////////////////////////////////
3102 //_____________________________________________________________________
3103 TProfile2D* AliTRDCalibraFillHisto::GetPH2d(Int_t nbtimebin, Float_t samplefrequency)
3106 // return pointer to fPH2d TProfile2D
3107 // create a new TProfile2D if it doesn't exist allready
3113 fTimeMax = nbtimebin;
3114 fSf = samplefrequency;
3120 //_____________________________________________________________________
3121 TH2I* AliTRDCalibraFillHisto::GetCH2d()
3124 // return pointer to fCH2d TH2I
3125 // create a new TH2I if it doesn't exist allready
3134 ////////////////////////////////////////////////////////////////////////////////////////////
3135 // Drift velocity calibration
3136 ///////////////////////////////////////////////////////////////////////////////////////////
3137 //_____________________________________________________________________
3138 TLinearFitter* AliTRDCalibraFillHisto::GetLinearFitter(Int_t detector, Bool_t force)
3141 // return pointer to TLinearFitter Calibration
3142 // if force is true create a new TLinearFitter if it doesn't exist allready
3145 if ((!force) || (fLinearFitterArray.UncheckedAt(detector))){
3146 return (TLinearFitter*)fLinearFitterArray.UncheckedAt(detector);
3149 // if we are forced and TLinearFitter doesn't yet exist create it
3151 // new TLinearFitter
3152 TLinearFitter *linearfitter = new TLinearFitter(2,"pol1");
3153 fLinearFitterArray.AddAt(linearfitter,detector);
3154 return linearfitter;
3157 //____________________________________________________________________________
3158 void AliTRDCalibraFillHisto::AnalyseLinearFitter()
3161 // Analyse array of linear fitter because can not be written
3162 // Store two arrays: one with the param the other one with the error param + number of entries
3165 for(Int_t k = 0; k < 540; k++){
3166 TLinearFitter *linearfitter = GetLinearFitter(k);
3167 if((linearfitter!=0) && (fEntriesLinearFitter[k]>10)){
3168 TVectorD *par = new TVectorD(2);
3169 TVectorD pare = TVectorD(2);
3170 TVectorD *parE = new TVectorD(3);
3171 linearfitter->Eval();
3172 linearfitter->GetParameters(*par);
3173 linearfitter->GetErrors(pare);
3174 Float_t ppointError = TMath::Sqrt(TMath::Abs(linearfitter->GetChisquare())/fEntriesLinearFitter[k]);
3175 (*parE)[0] = pare[0]*ppointError;
3176 (*parE)[1] = pare[1]*ppointError;
3177 (*parE)[2] = (Double_t) fEntriesLinearFitter[k];
3178 ((TObjArray *)fLinearVdriftFit->GetPArray())->AddAt(par,k);
3179 ((TObjArray *)fLinearVdriftFit->GetEArray())->AddAt(parE,k);