CMS 3D CMS Logo

/data/doxygen/doxygen-1.7.3/gen/CMSSW_4_2_8/src/Alignment/CommonAlignmentAlgorithm/src/AlignmentCorrelationsIORoot.cc

Go to the documentation of this file.
00001 #include "TTree.h"
00002 
00003 #include "Alignment/CommonAlignment/interface/Alignable.h"
00004 #include "Alignment/CommonAlignment/interface/AlignmentParameters.h"
00005 #include "FWCore/MessageLogger/interface/MessageLogger.h"
00006 
00007 // this class's header
00008 #include "Alignment/CommonAlignmentAlgorithm/interface/AlignmentCorrelationsIORoot.h"
00009 
00010 // ----------------------------------------------------------------------------
00011 // constructor
00012 
00013 AlignmentCorrelationsIORoot::AlignmentCorrelationsIORoot()
00014 {
00015   treename = "AlignmentCorrelations";
00016   treetxt = "Correlations";
00017 }
00018 
00019 // ----------------------------------------------------------------------------
00020 
00021 void AlignmentCorrelationsIORoot::createBranches(void) 
00022 {
00023   tree->Branch("Ali1Id",    &Ali1Id,    "Ali1Id/i");
00024   tree->Branch("Ali2Id",    &Ali2Id,    "Ali2Id/i");
00025   tree->Branch("Ali1ObjId", &Ali1ObjId, "Ali1ObjId/I");
00026   tree->Branch("Ali2ObjId", &Ali2ObjId, "Ali2ObjId/I");
00027   tree->Branch("corSize",   &corSize,   "corSize/I");
00028   tree->Branch("CorMatrix", &CorMatrix, "CorMatrix[corSize]/D");
00029 }
00030 
00031 // ----------------------------------------------------------------------------
00032 
00033 void AlignmentCorrelationsIORoot::setBranchAddresses(void) 
00034 {
00035   tree->SetBranchAddress("corSize",   &corSize);
00036   tree->SetBranchAddress("Ali1Id",    &Ali1Id);
00037   tree->SetBranchAddress("Ali2Id",    &Ali2Id);
00038   tree->SetBranchAddress("Ali1ObjId", &Ali1ObjId);
00039   tree->SetBranchAddress("Ali2ObjId", &Ali2ObjId);       
00040   tree->SetBranchAddress("CorMatrix", &CorMatrix);
00041 }
00042 
00043 // ----------------------------------------------------------------------------
00044 
00045 int AlignmentCorrelationsIORoot::write(const align::Correlations& cor, bool validCheck)
00046 {
00047   int icount=0;
00048 
00049   for(align::Correlations::const_iterator it=cor.begin();
00050     it!=cor.end();it++) {
00051     AlgebraicMatrix mat=(*it).second;
00052         std::pair<Alignable*,Alignable*> Pair = (*it).first;
00053     Alignable* ali1 = Pair.first;
00054     Alignable* ali2 = Pair.second;
00055     if( (ali1->alignmentParameters()->isValid()
00056          && ali2->alignmentParameters()->isValid()) || !(validCheck)) {
00057       Ali1ObjId = ali1->alignableObjectId(); 
00058       Ali2ObjId = ali2->alignableObjectId(); 
00059       Ali1Id = ali1->id();
00060       Ali2Id = ali2->id();
00061       int maxColumn = mat.num_row();
00062       corSize = maxColumn*maxColumn;
00063       for(int row = 0;row<maxColumn;row++)        
00064                 for(int col = 0;col<maxColumn;col++)
00065                   CorMatrix[row+col*maxColumn] =mat[row][col]; 
00066       tree->Fill();
00067       icount++;
00068     }
00069   }
00070   edm::LogInfo("AlignmentCorrelationsIORoot") << "Writing correlations: all,written: " 
00071                                               << cor.size() << "," << icount;
00072   return 0;
00073 }
00074 
00075 // ----------------------------------------------------------------------------
00076 // read correlations for those alignables in vector given as argument
00077 
00078 align::Correlations 
00079 AlignmentCorrelationsIORoot::read(const align::Alignables& alivec, int& ierr)
00080 {
00081   align::Correlations theMap;
00082 
00083   // create ID map for all Alignables in alivec
00084   align::Alignables::const_iterator it1;
00085   std::map< std::pair<unsigned int,int>, Alignable* > idAlis;
00086   for( it1=alivec.begin();it1!=alivec.end();it1++ )
00087     idAlis[std::make_pair((*it1)->id(),(*it1)->alignableObjectId())] = (*it1);
00088 
00089   std::map<std::pair<unsigned int,int>,Alignable*>::const_iterator aliSearch1;  
00090   std::map<std::pair<unsigned int,int>,Alignable*>::const_iterator aliSearch2;  
00091   int nfound=0;
00092   double maxEntry = tree->GetEntries();
00093   for( int entry = 0;entry<maxEntry;entry++ ) 
00094         {
00095           tree->GetEntry(entry);
00096           aliSearch1 = idAlis.find(std::make_pair(Ali1Id,Ali1ObjId));
00097           aliSearch2 = idAlis.find(std::make_pair(Ali2Id,Ali2ObjId));
00098           if (aliSearch1!=idAlis.end()
00099                   && aliSearch2!=idAlis.end()) 
00100                 {
00101                   // Alignables for this pair found
00102                   nfound++;
00103                   Alignable* myAli1 = (*aliSearch1).second;
00104                   Alignable* myAli2 = (*aliSearch2).second;
00105                   // FIXME: instead of nParMax in the next few lines one should probably
00106                   //        use something like sqrt(corSize) - but take care of rounding!
00107                   //        I have no time to test... :-( GF
00108                   AlgebraicMatrix  mat(nParMax,nParMax);
00109                   for(int row = 0;row<nParMax;row++) 
00110                         for(int col = 0;col<nParMax;col++) 
00111                           mat[row][col] = CorMatrix[row+col*nParMax];
00112                   theMap[ std::make_pair(myAli1,myAli2) ] = mat;
00113                 }
00114         }
00115 
00116   edm::LogInfo("AlignmentCorrelationsIORoot") << "Read correlations: all,read: " 
00117                                               << alivec.size() << "," << nfound;
00118 
00119   ierr=0;
00120   return theMap;
00121 }